Как конвертировать тип данных TEXT в дату
Есть приложение, которое создает заметки на определенный день и время.
Время и дата добавляется в базу данных с помощью виджета QDateTimeEdit, но в базу добавляется в виде данных TEXT.
Мне надо конвертировать в тип данных DATE, чтобы дальше работать с этой датой.
Однако не знаю как именно нужно конвертировать. Помогите пожалуйста.
Если надо, то могу обновить вопрос и выложить часть кода отвечающую за базу данных.
Вот код базы данных:
import sqlite3
import os
import logging
#from dotenv import load_dotenv
from win10toast import ToastNotifier
import datetime
ENV_LOCATION = os.path.relpath(r'.env')
logger = logging.getLogger(__name__)
#load_dotenv(ENV_LOCATION)
class DatabaseHandler:
__DB_LOCATION = os.getenv('DB_LOCATION')
def __init__(self, db_location=None):
""" Initialize db class variables """
if db_location is not None:
""" Allows to set db location through argument """
self.connection = sqlite3.connect(db_location)
else:
self.connection = sqlite3.connect('server.db', detect_types=sqlite3.PARSE_DECLTYPES |
sqlite3.PARSE_COLNAMES)
self.cur = self.connection.cursor()
def select(self, table_name):
self.cur.execute(f"SELECT * FROM {table_name};")
def insert(self, table_name, task_name, task_details, task_addition_date, task_deadline):
self.cur.execute(f"INSERT INTO {table_name} VALUES (:task, :details, :add_date, :deadline);",
{'task': task_name, 'details': task_details, 'add_date': task_addition_date,
'deadline': task_deadline})
self.cur.execute(f"SELECT * FROM {table_name} WHERE TaskDeadline='{task_deadline}';")
"""
def remind(self, table_name, task_deadline):
self.cur.execute(f"SELECT * FROM {table_name} WHERE TaskDeadline <= strftime('%Y-%m-%d %H:%M:00', datetime('now', '-1 hours'))")
self.cur.fetchone()
print('DA')
"""
def text_to_datetime(self, table_name):
self.cur.execute(f"ISERT INTO {table_name} (TaskDeadline) VALUES (strftime('%Y-%m-%d %H:%M:00'))")
self.cur.execute(f"SELECT TaskDeadline FROM {table_name} WHERE TaskDeadline => strftime('%Y-%m-%d %H:%M:00', datetime('now', '-1 hours'))")
self.cur.fetchone()
print('PRIVET')
def delete(self, table_name, record):
self.cur.execute(f"DELETE FROM {table_name} WHERE TaskName=(:item);",
{'item': record})
def update(self, table_name, task_name, new_task_name, new_task_details, new_task_deadline):
self.cur.execute(f"UPDATE {table_name} SET TaskName=(:new_name), TaskDetails=(:new_details), \
TaskDeadline=(:new_deadline) WHERE TaskName=(:old_name);",
{'new_name': new_task_name, 'new_details': new_task_details, 'new_deadline': new_task_deadline,
'old_name': task_name})
def create_table(self, table_name):
self.cur.execute(f""" CREATE TABLE IF NOT EXISTS {table_name}( TaskName TEXT, \
TaskDetails TEXT, \
AdditionDate TEXT, \
TaskDeadline TEXT)""")
def transfer_data_between_tables(self, table1_name, table2_name, key_value):
self.cur.execute(f"INSERT INTO {table2_name} SELECT * FROM {table1_name} WHERE TaskName=(:value);",
{'value': key_value})
self.delete(table1_name, key_value)
def drop_table(self, table_name):
self.cur.execute(f"DROP TABLE IF EXISTS {table_name}")
print(f"Dropped the {table_name} table")
def __enter__(self):
return self
def __exit__(self, ext_type, exc_value, traceback):
self.cur.close()
if isinstance(exc_value, Exception):
self.connection.rollback()
else:
self.connection.commit()
self.connection.close()
Ответы (2 шт):
Попробуйте так:
import sys
import sqlite3
#import datetime
from PyQt5 import QtCore, QtWidgets, QtGui, uic
from PyQt5.Qt import *
app = QApplication(sys.argv)
# !!! QDateEdit
dateEdit = QtWidgets.QDateEdit()
# так dateEdit.setDate(QtCore.QDate(2019, 2, 23))
# или так
dateEdit.setDate(dateEdit.date().currentDate())
print(f'\n\ndateEdit = {dateEdit}')
today = dateEdit.date()
print(f'today = {today}')
today = today.toString('yyyy-MM-dd')
print(f'today = {today}\n')
# !!! QDateTimeEdit
dateTimeEdit = QtWidgets.QDateTimeEdit()
dateTimeEdit.setDateTime(QtCore.QDateTime(
QtCore.QDate(2021, 5, 15), QtCore.QTime(15, 7, 33, 123)
)
)
print(f'dateTimeEdit = {dateTimeEdit}')
now = dateTimeEdit.dateTime()
print(f'now = {now}')
now = now.toString('yyyy-MM-dd hh:mm:ss.zzz')
print(f'now = {now}\n')
# !!! sqlite3
con = sqlite3.connect(
"test_datetime.db",
detect_types=sqlite3.PARSE_DECLTYPES |
sqlite3.PARSE_COLNAMES
)
cur = con.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS test(d date, ts timestamp)")
con.commit()
cur.execute("INSERT INTO test(d, ts) values (?, ?)", (today, now))
con.commit()
cur.execute("SELECT d, ts FROM test")
row = cur.fetchone()
print(today, "=>", row[0], type(row[0]))
print(now, "=>", row[1], type(row[1]))
print()
cur.execute(
'SELECT current_date as "d [date]", current_timestamp as "ts [timestamp]"'
)
row = cur.fetchone()
print("current_date ", row[0], type(row[0]))
print("current_timestamp", row[1], type(row[1]))
con.close()
SQLite позволяет регистрировать свои типы, которые хранятся как текст.
create table log ( date DATE, data TEXT );
В Python регистрируешь 2 функции для сериализации и десериализации:
from datetime import datetime
def convert_date(text):
return datetime.fromisoformat(text)
def adapt_date(dt):
return dt.isoformat()
sqlite3.register_converter("DATE", convert_date)
sqlite3.register_adapter(datetime, adapt_date)
А дальше можно прозрачно сохранять и загружать datetime в базу. Выгрузку и загрузку Вам удобнее наверное переписать для QDate.
