На этом шаге мы рассмотрим особенности выполнения этой операции.
В SQLite нет специальных типов данных для представления даты и времени. Поэтому обычно дату преобразовывают в строку или число (количество секунд, прошедших с начала эпохи) и сохраняют в соответствующих полях. При выводе данные необходимо опять преобразовывать. Используя знания, полученные в предыдущих шагах, можно зарегистрировать две функции преобразования:
# -*- coding: utf-8 -*- import sqlite3, datetime, time # Преобразование даты в число def my_adapter(t): return time.mktime(t.timetuple()) # Преобразование числа в дату def my_converter(t): return datetime.datetime.fromtimestamp(float(t)) # Регистрируем обработчики sqlite3.register_adapter(datetime.datetime, my_adapter) sqlite3.register_converter("mytime", my_converter) # Получаем текущую дату и время dt = datetime.datetime.today() con = sqlite3.connect(":memory:", isolation_level=None, detect_types=sqlite3.PARSE_COLNAMES) cur = con.cursor () cur.execute("CREATE TABLE times (time)") cur.execute("INSERT INTO times VALUES (?)", (dt,)) cur. execute ("""SELECT time as "t [mytime]" FROM times""") print(cur.fetchone()[0]) # Результат con.close () input()
Результат работы приложения:
2018-11-19 09:54:43
Модуль sqlite3 для типов date и datetime из модуля datetime содержит встроенные функции для преобразования типов. Для datetime, date зарегистрирован тип date, а для datetime.datetime - тип timestamp. Таким образом, создавать пользовательские функции преобразования не нужно. Пример сохранения в таблице даты и времени приведен ниже:
# -*- coding: utf-8 -*- import sqlite3, datetime # Получаем текущую дату и время d = datetime.date.today() dt = datetime.datetime.today() con = sqlite3.connect(":memory:", isolation_level=None, detect_types=sqlite3.PARSE_DECLTYPES) cur = con.cursor() cur.execute("CREATE TABLE times (d date, dt timestamp)") cur.execute("INSERT INTO times VALUES (?, ?)", (d, dt)) cur.execute("SELECT d, dt FROM times") res = cur.fetchone() print(res[0]) print(res[1]) input ()
Результат работы приложения:
2018-11-19
2018-11-19 10:04:10.056000
На следующем шаге мы рассмотрим обработку исключений.