Sqlite «OperationalError: рядом с «05»: синтаксическая ошибка»

#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