Ответ 1
Если вы установили detect_types=sqlite3.PARSE_DECLTYPES
в sqlite3.connect
,
то соединение попытается преобразовать типы данных sqlite в типы данных Python
когда вы извлекаете данные из базы данных.
Это очень хорошо, так как гораздо приятнее работать с объектами datetime, чем
случайные строки, относящиеся к дате, которые вам нужно проанализировать с помощью
datetime.datetime.strptime
или dateutil.parser.parse
.
К сожалению, использование detect_types
не останавливает принятие sqlite
строки как данные DATE, но вы получите сообщение об ошибке при попытке
извлекать данные из базы данных (если она была вставлена в каком-либо формате, отличном от ГГГГ-ММ-ДД)
потому что соединение не сможет преобразовать его в объект 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.date:
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),)
Вы также можете вставлять строки как данные DATE, если вы используете формат YYYY-MM-DD. Обратите внимание, что хотя вы вставляете строку, она возвращается в виде объекта 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))
Итак, если вы дисциплинированно вставляете только теги datetime.date
в поле DATE
, то при извлечении данных у вас не будет проблем.
Если ваши пользователи вводят данные даты в различных форматах, посмотрите dateutil.parser.parse. Он может помочь вам преобразовать эти различные строки в объекты datetime.datetime
.