0

狂気まで検索した後、ここに質問を投稿することにしました。cursor.execute(SQL, param) 関数の安全な変数置換関数を利用したい sqlite3 データベースを作成しようとしています。私の機能は次のようになります:

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import sqlite3

def create():
    values = ("data")
    sql = "CREATE TABLE IF NOT EXISTS ? ( name TEXT, street TEXT, time REAL, age INTEGER )"

    con = sqlite3.connect("database.db")
    c = con.cursor()
    c.execute(sql, values)
    con.commit()
    c.close()
    con.close()

if __name__ = "__main__":
    create()

最初の引数は文字列形式の sql コマンドであり、2 番目の引数は ? SQL文字列にあります。ただし、ファイルを実行すると、次のエラーが返されます。

$ ./test.py 

Traceback (most recent call last):
  File "./test.py", line 21, in <module>
    create()
  File "./test.py", line 14, in create
    c.execute(sql, values)
sqlite3.OperationalError: near "?": syntax error

これは、paramstyle が named に設定されている場合にも発生します (例: :table フォーム)。ここでは構文エラーを見つけることができないので、システムのどこかで問題が発生しているに違いないと思います。Archlinux と Debian のインストールでテストしましたが、どちらも同じエラーが表示されます。

どこで原因を探せばよいのか、もうわからないので、あなた次第です。

4

2 に答える 2

5

SQL パラメータは挿入データにのみ適用でき、テーブル名には適用できません。つまり、DDL ステートメントのパラメーターは解析されません。

そのためには、文字列の書式設定を使用する必要があります。

sql = "CREATE TABLE IF NOT EXISTS {} ( name TEXT, street TEXT, time REAL, age INTEGER )".format(*values)
于 2013-11-07T18:24:08.993 に答える
0

私が理解しているように、あなたのパラメータはテーブル名ですか?

あなたのコマンドは

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl
于 2013-11-08T13:17:45.693 に答える