Как создать таблицу 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.

    Следуя этим советам, вы сможете гибко организовывать данные по месяцам без синтаксических ошибок.

    Часто задаваемые вопросы