あなたはsqlite3.connect
でdetect_types=sqlite3.PARSE_DECLTYPES
、 を設定した場合、接続は、データベースからデータを引き出す際にPythonのデータ型 にsqliteのデータ型を変換しようとします。
これは、非常に良くあなたが datetime.datetime.strptime
かdateutil.parser.parse
で解析する必要が ランダム日付のような文字列よりも日時オブジェクトを操作するので、非常に良いことです。
残念ながら、detect_types
を使用すると、それは以外のいくつかの形式で挿入された場合(データベースからデータを引き出すDATEデータとして受諾 文字列からのsqliteを停止しませんが、あなたは しようとするとエラーになりますYYYY-MM-DD) 接続がdatetime.dateオブジェクトに変換するために失敗するので:
conn=sqlite3.connect(':memory:',detect_types=sqlite3.PARSE_DECLTYPES)
cur=conn.cursor()
cur.execute('CREATE TABLE foo(bar DATE)')
# Unfortunately, this is still accepted by sqlite
cur.execute("INSERT INTO foo(bar) VALUES (?)",('25/06/2003',))
# But you won't be able to draw the data out later because parsing will fail
try:
cur.execute("SELECT * FROM foo")
except ValueError as err:
print(err)
# invalid literal for int() with base 10: '25/06/2003'
conn.rollback()
しかし、少なくともエラーはあなたが 文字列を挿入したという事実を警告しますDATEは本当にdatetimeを挿入する必要があります。日付オブジェクト:
cur.execute("INSERT INTO foo(bar) VALUES (?)",(datetime.date(2003,6,25),))
cur.execute("SELECT ALL * FROM foo")
data=cur.fetchall()
data=zip(*data)[0]
print(data)
# (datetime.date(2003, 6, 25),)
YYYY-MM-DD形式を使用する限り、DATEデータとして文字列を挿入することもできます。あなたは、文字列を挿入しますが、それはdatetime.date
オブジェクトとして出戻ってくることに注意してください:
cur.execute("INSERT INTO foo(bar) VALUES (?)",('2003-06-25',))
cur.execute("SELECT ALL * FROM foo")
data=cur.fetchall()
data=zip(*data)[0]
print(data)
# (datetime.date(2003, 6, 25), datetime.date(2003, 6, 25))
ですから、DATE
フィールドにのみdatetime.date
オブジェクトを挿入について規律ある場合に描画するとき、あなたは後で問題ありませんよデータを出力する。
ユーザーがさまざまな形式の日付データを入力している場合は、dateutil.parser.parseをチェックしてください。これらのさまざまな文字列をdatetime.datetime
オブジェクトに変換するのに役立つ場合があります。
ありがとうございます。日付オブジェクトのように見えます。よろしく。 –