Как создать таблицу SQLite с именем из даты
При попытке использовать дату (например, 2024.06) в качестве имени таблицы в SQLite возникает ошибка sqlite3.OperationalError: near "2024.06": syntax error. Это связано с тем, что SQLite не допускает точки и некоторые другие символы в идентификаторах без специального экранирования. В этой статье мы объясним, как правильно создать динамическое имя таблицы с датой, избежать синтаксических ошибок и организовать хранение данных по месяцам.
Почему возникает ошибка при имени таблицы с точкой
SQLite, как и большинство СУБД, требует, чтобы имена таблиц и столбцов начинались с буквы или подчёркивания и не содержали специальных символов (точка, дефис, пробел). Точка зарезервирована для разделения имени базы данных и таблицы (например, main.table). Поэтому 2024.06 интерпретируется как имя базы данных 2024 и имя таблицы 06, что приводит к синтаксической ошибке. Чтобы использовать дату как имя, нужно экранировать идентификатор.
Способы экранирования имени таблицы в SQLite
1. Обратные кавычки или квадратные скобки
Самый простой способ - заключить имя таблицы в обратные кавычки (backticks) или квадратные скобки. Это явно указывает SQLite, что строка является идентификатором, а не ключевым словом или числом. Пример:
c.execute(f"""CREATE TABLE `{now_date}` (
name text,
family text,
date text
)""")Аналогично работают квадратные скобки: CREATE TABLE [2024.06] (...). Обратные кавычки предпочтительнее, так как соответствуют стандарту SQL и поддерживаются в Python.
2. Замена точки на подчёркивание
Если вам не принципиально сохранить точку, можно заменить её на подчёркивание. Это даёт валидное имя таблицы без экранирования. Пример: now_date = '2024_06'. Тогда код будет работать без дополнительных символов:
now_date = '2024_06'
c.execute(f"""CREATE TABLE {now_date} (
name text,
family text,
date text
)""")Этот способ проще, но теряется формат даты с точкой.
3. Использование префикса
Добавьте к дате буквенный префикс, например, month_. Это гарантирует, что имя начинается с буквы, и точка перестаёт быть проблемой. Пример: now_date = 'month_2024.06'. Код:
now_date = 'month_2024.06'
c.execute(f"""CREATE TABLE `{now_date}` (
name text,
family text,
date text
)""")Префикс делает имя более читаемым и однозначно идентифицирует таблицу как месячную.
Как динамически формировать имя таблицы с текущей датой
Часто требуется создавать таблицы для каждого месяца автоматически. Используйте модуль datetime для получения текущей даты и форматирования:
from datetime import datetime
now_date = datetime.now().strftime('%Y_%m') # '2024_06'
c.execute(f"""CREATE TABLE IF NOT EXISTS `{now_date}` (
name text,
family text,
date text
)""")Конструкция IF NOT EXISTS предотвращает ошибку, если таблица уже создана. Это удобно для скриптов, запускаемых раз в месяц.
Рекомендации по именованию таблиц с датами
- Используйте формат ГГГГ_ММ - он сортируется по алфавиту и легко парсится.
- Добавляйте префикс (например,
data_), чтобы избежать конфликтов с зарезервированными словами. - Всегда экранируйте имена, если используете точку или дефис - это универсальное правило безопасности.
- Проверяйте существование таблицы через
IF NOT EXISTSили запрос кsqlite_master.
Следуя этим советам, вы сможете гибко организовывать данные по месяцам без синтаксических ошибок.