#python #python-3.x #sqlite
#python #python-3.x #sqlite
Вопрос:
Я работаю с sqlite, и мне немного сложно справиться с датой и временем. У меня есть таблица , созданная с полем Date
типа text
.
Мне нужно установить для этого поля пользовательское время, например: '2021-01-18 05:07:37'
которое я получаю с помощью этого кода (сейчас я использую datetime только в качестве примера).
date = datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S')
print(date)
# 2021-01-18 05:07:37
Затем я создаю запись с этой датой:
command = f'''INSERT INTO Twitter (Date, Content)
VALUES(datetime({date}), "Some cool content")'''
print(command)
# INSERT INTO Twitter (Date, Content)
VALUES(datetime(2021-01-18 05:13:54), "Some cool content")
conn.execute(command)
conn.commit()
Этот код выдает ошибку:
Обратная
трассировка OperationalError (последний последний вызов)в
2 ЗНАЧЕНИЯХ (datetime({дата}), «Какой-то классный контент»)»‘
3 печать (команда)
—-> 4 выполнение (команда)
5 фиксация ()OperationalError: рядом с «05»: синтаксическая ошибка
Я не уверен, что не так, я думаю, что я правильно использую формат даты и времени sqlite, но ошибка, похоже, каким-то образом связана с форматом, есть предложения о том, как я могу это решить?
Редактировать
Я отметил, что если я добавлю вручную дату в команду sqlite, это будет работать хорошо, например, делать это:
command = f'''INSERT INTO Twitter (Date, Content)
VALUES(datetime('2021-01-18 05:07:37'), "Some cool content")'''
Проблема возникает, когда я динамически добавляю дату и время в качестве переменной, я не уверен, что я что-то упустил.
Комментарии:
1. Никогда не используйте f-строки другого строкового форматирования для построения SQL. Это небезопасно и приводит к ошибкам, подобным вашим. Проверьте документы вашего адаптера базы данных, чтобы узнать, как указывать аргументы
execute()
.2. @KlausD. похоже, это проблема, если я добавлю значение вручную, работает без ошибок
3. Проблема не в этом. В вашем первом примере отсутствуют одинарные кавычки (
'
) вокруг даты / времени.
Ответ №1:
Проблема в том, что sqlite не знаком с datetime
типом python, поэтому, пытаясь вставить datetime(2021-01-18 05:13:54)
в Date
поле, которое вы получаете OperationalError: near "05": syntax error
, и когда вы добавляете одинарные кавычки, такие как '2021-01-18 05:07:37'
дата, преобразуется в строку и может быть вставлена в таблицу.
Вы можете попытаться сделать
command = f'''INSERT INTO Twitter (Date, Content)
VALUES(datetime('{date}'), "Some cool content")'''
или
command = f'''INSERT INTO Twitter (Date, Content)
VALUES(datetime("{date}"), "Some cool content")'''
Примечание: функция sqlite datetime
ожидает строку, как описано здесь https://sqlite.org/lang_datefunc.html