0

sqlite (python sqlite3) で非常に単純なクエリを実行すると、奇妙な動作が発生します。

これが機能するクエリです

cursor = self.con.cursor()
cursor.execute("SELECT * FROM vpro1 ORDER BY :orderby DESC LIMIT 1", {"table": "vpro1", "orderby": self.unit_timestamp})

しかし、これは私にエラーを投げます

cursor = self.con.cursor()
cursor.execute("SELECT * FROM :table ORDER BY :orderby DESC LIMIT 1", {"table": "vpro1", "orderby": self.unit_timestamp})

例外は

sqlite3.OperationalError: near ":table": syntax error

したがって、テーブル名にqmarkを使用しようとすると、エラーがスローされます。クエリでハードコードすると機能し、:orderbyは使用するもの(qmark、ハードコード、名前付き)で機能します... qmarkスタイルと同じ動作( ?,? タプル付き)

アドバイスありがとうございます !

4

1 に答える 1

2

DB API を使用してテーブル名を完成させることはできません。原因はわかりませんが、過去に同じ問題に遭遇したことがあります。SQLite や MySQL などでは動作しません。

回避策については、別の質問に対するDonald Minerの回答を参照してください。

def scrub(table_name):
    return ''.join( chr for chr in table_name if chr.isalnum() )

scrub('); drop tables --')  # returns 'droptables'

次に、これをフォーマット文字列として渡します。

table = "vpro1"
cursor.execute("SELECT * FROM {0} ORDER BY :orderby DESC LIMIT 1".format(scrub(table)), {"orderby": self.unit_timestamp})
于 2013-01-18T15:09:35.020 に答える