web-dev-qa-db-ja.com

sqliteにintを挿入するときのパラメーターはサポートされていません

私は後で比較を使用してレコードを取得する目的で、SQLite3に日付と時刻を保存することを何度も行ってきましたSELECT * WHERE date1 < date2

私はついにdatetime.datetimeオブジェクトを保存しようとするのをあきらめ、代わりにUNIXタイムスタンプを使用することに決めました。これらは単なるintであり、操作が簡単ですが、まだエラーが発生しています。

import sqlite3 as lite
import datetime
import time

conn = lite.connect('dispatcher.db')
cur = conn.cursor()
query = "create table if not exists new_test (curent_dt)"
cur.execute(query)
conn.commit()
now = datetime.datetime.now() - datetime.timedelta(minutes=60)
temp = int(time.mktime(now.timetuple()))
cur.execute('insert into new_test (curent_dt) values (? )', (temp))
conn.commit()
conn.close()

次のエラーを返します。

cur.execute( 'insert into new_test(curent_dt)values(?)'、(temp))ValueError:パラメータはサポートされていないタイプです

問題をさらに詳しく調べた後、単一要素のタプルを作成するには末尾のコンマを使用する必要があることがわかりました。 (temp,)

46
Tim McDonald

以下の「temp」の後に追加されたカンマに注意してください。

cur.execute('insert into new_test (curent_dt) values (?)', (temp,))

これが起こる理由は、(temp)は整数ですが、(temp,)は、tempを含む長さ1のタプルです。

74
Alex Flint
cur.execute('insert into new_test (curent_dt) values (? )', (temp))

このコードを

cur.execute('insert into new_test (curent_dt) values (? )', (temp,))

Pythonでは、(temp)と(temp、)は2つの異なるものです。 (temp)は整数のような通常の変数ですが、(temp、)はタプルです。タプルは、各要素の後にコンマを指定することによってのみ取得され、execute()メソッドは2番目のパラメーターでタプルのみを取得します。

5
Gurbaksh Singh