python sqlite3 cursor.execute()パラメーターを使用すると、近くの構文エラーが発生しますか? (パラメンタイルQmark)

StackOverflow https://stackoverflow.com/questions/19843668

質問

狂気まで検索した後、私はここに質問を投稿することにしました。 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

これは、パラメンタイルが名前が付けられている場合にも発生します(例:テーブルフォーム)。ここでは構文エラーを見つけることができないので、問題はシステムのどこかで発生する必要があると思います。 ArchlinuxとDebianのインストールでテストしましたが、どちらも同じエラーを投稿しました。

私はもう原因を探すべきかわからないので、今はあなたがいる。

役に立ちましたか?

解決

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

そのためには、文字列のフォーマットを使用する必要があります。

sql = "CREATE TABLE IF NOT EXISTS {} ( name TEXT, street TEXT, time REAL, age INTEGER )".format(*values)

他のヒント

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

だからあなたのコマンドはそうなるだろう

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top