1

おそらく非常に単純な答えがある単純な質問。「2012-06-10」形式の日付文字列をPythonスクリプトからTEXT列に書き込んでいます。

例えば

cur.execute( "CREATE TABLE tbl(date TEXT、...)")

cur.execute('INSERT INTO tbl VALUES(%s)'%(str(date [i]))、...)

スクリプトは実際に日付文字列を評価しているため、「2012-06-10」は「1996」としてテーブルに書き込まれます。ドキュメントを読んだことから、これは型の親和性と関係があると思いますが、オーバーライドする方法や、文字列が評価される理由さえわかりません。

4

1 に答える 1

9

ふたつのやり方:

  • パラメータ化されたクエリを使用する:cur.execute("INSERT INTO tbl VALUES (?), [str(date[i])])。これが最善の方法です。このようにしてください。2番目の方法は、後世のためにのみ含まれています。
  • 値を引用することによって(注:これはほぼ確実にほとんどすべての場合に間違った方法cur.execute("INSERT INTO tbl VALUES ('%s')" %(str(date[i]), )です):。注意しないとSQLインジェクションに対して脆弱になるため、この方法は最適ではありません。

これが起こっている理由を理解するために、コードがSQLiteに送信しているクエリを想像してみてください。

 INSERT INTO tbl VALUES (2012-06-10);

SQLエンジンが正しく評価するもの:

 INSERT INTO tbl VALUES (1996);

値を引用すると、この問題は解決します。

 INSERT INTO tbl VALUES ('2012-06-10');

ただし、値に特定の文字('またはnullバイトなどの文字)が含まれていると、問題が発生する可能性があります。

ただし、パラメーター化されたクエリでは、値はクエリとは別に送信されるため、誤って解釈される可能性はありません。

于 2012-09-11T21:14:14.373 に答える