Загрузка...

Sqlite3 как обновлять таблицу при изменении данных

Тема в разделе Python создана пользователем eoy 12 июн 2025 в 23:45. 108 просмотров

  1. eoy
    eoy Автор темы 12 июн 2025 в 23:45 341 14 дек 2022
    Смотрите у меня например есть таблица


    c.execute('''
    CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,
    )
    ''')

    а я например захотел добавить в нее password_hash TEXT NOT NULL,

    или еще что то, можно ли сделать как то что бы все таблицы обновлялись каждый раз при изменении

    Просто писать функцию для каждой таблицы для проверки это пздц

    Можно ли как то сделать это просто?
     
  2. rage
    rage 12 июн 2025 в 23:47 marlboro country 712 18 янв 2020
    Да, можно автоматизировать процесс обновления структуры таблиц при изменении модели. Вот несколько подходов:

    ### 1. Использование миграций (рекомендуемый способ)
    Лучше использовать систему миграций, например:
    - Для SQLite: `alembic` (легковесная система миграций)
    - Или другие инструменты вроде `sqlite3utils`

    Пример с Alembic:
    ```python
    from alembic import op
    import sqlalchemy as sa

    def upgrade():
    op.add_column('users', sa.Column('password_hash', sa.Text(), nullable=False))

    def downgrade():
    op.drop_column('users', 'password_hash')
    ```

    ### 2. Простой самодельный подход
    Если не хотите использовать миграции, можно проверять наличие столбцов при старте:

    ```python
    def check_and_update_table():
    # Проверяем наличие столбца
    c.execute("PRAGMA table_info(users)")
    columns = [column[1] for column in c.fetchall()]

    if 'password_hash' not in columns:
    try:
    c.execute('ALTER TABLE users ADD COLUMN password_hash TEXT NOT NULL DEFAULT ""')
    conn.commit()
    except sqlite3.OperationalError as e:
    print(f"Ошибка при добавлении столбца: {e}")
    ```

    ### 3. Использование ORM (лучший вариант для больших проектов)
    Если используете SQLAlchemy, Django ORM или Peewee, они предоставляют системы миграций:
    - Django: `python manage.py makemigrations` + `migrate`
    - SQLAlchemy: Alembic
    - Peewee: `pw_migrate`

    ### 4. Полная пересоздание таблицы (только для разработки)
    Для маленьких проектов можно просто пересоздавать таблицы:

    ```python
    def recreate_tables():
    c.execute('DROP TABLE IF EXISTS users')
    c.execute('''
    CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,
    password_hash TEXT NOT NULL
    )
    ''')
    conn.commit()
    ```

    **Совет:** Для production-проектов лучше использовать настоящие миграции (Alembic или Django ORM), так как они позволяют:
    1. Контролировать изменения
    2. Откатывать изменения при проблемах
    3. Учитывать уже существующие данные
     
    12 июн 2025 в 23:47 Изменено
  3. eoy
    eoy Автор темы 12 июн 2025 в 23:48 341 14 дек 2022
    гпт подсказал что можно сделать так, это правильно?


    import sqlite3

    TABLE_DEFINITIONS = {
    "users": {
    "id": "INTEGER PRIMARY KEY AUTOINCREMENT",
    "username": "TEXT UNIQUE NOT NULL",
    "password_hash": "TEXT NOT NULL",
    "created_at": "TIMESTAMP DEFAULT CURRENT_TIMESTAMP"
    },
    }

    def migrate_tables(conn):
    cursor = conn.cursor()

    for table_name, columns in TABLE_DEFINITIONS.items():
    # Создаём таблицу, если её нет
    columns_str = ", ".join([f"{name} {type_}" for name, type_ in columns.items()])
    cursor.execute(f"CREATE TABLE IF NOT EXISTS {table_name} ({columns_str})")

    # Получаем существующие колонки
    cursor.execute(f"PRAGMA table_info({table_name})")
    existing_columns = [row[1] for row in cursor.fetchall()]

    # Добавляем недостающие колонки
    for column_name, column_type in columns.items():
    if column_name not in existing_columns:
    print(f"Добавляю колонку {column_name} в таблицу {table_name}")
    cursor.execute(f"ALTER TABLE {table_name} ADD COLUMN {column_name} {column_type}")

    conn.commit()
     
  4. LockBit
    через alter table, синтаксис в целом простой:
    alter table name add column c1 text;
    добавит колонку c1 с типом text, в таблицу name.

    остальное можешь загуглить)
     
Загрузка...
Top