SpecialistOff.NET / Вопросы / Статьи / Фрагменты кода / Резюме / Метки / Помощь / Файлы

Список вопросов Печать

Удалить или добавить поле (столбец) в базе sqlite3


Метки: sqlite sql alembic 

Ответы

RemiZOffAlex  Создано: 2019-09-18 16:37:43.100931  Обновлено: 2019-09-18 16:37:43.100931

Добавить новый столбец

Вариант I

  1. Получить схему нужной таблицы

    .schema tablename
    CREATE TABLE tablename (
        id INTEGER NOT NULL, 
        user VARCHAR NOT NULL, 
        created DATETIME, 
        PRIMARY KEY (id), 
        UNIQUE (user)
    );
  2. Переименовать старую таблицу

    PRAGMA legacy_alter_table=on;
    ALTER TABLE tablename RENAME TO tablename_old ;
  3. Создать новую таблицу

    CREATE TABLE tablename (
        id INTEGER NOT NULL,
        created DATETIME,
        PRIMARY KEY (id)
    );
  4. Скопировать данные из старой таблицы в новую

    INSERT INTO tablename SELECT id, created FROM tablename_old ;

    или

    INSERT INTO tablename (id, created) SELECT id, created FROM tablename_old ;
  5. Удалить старую таблицу

    DROP TABLE IF EXISTS tablename_old ;

Вариант II

ALTER TABLE {TableName} ADD COLUMN {NewColumn} {type};

Удалить столбец

  1. Получить схему нужной таблицы

    .schema tablename
    CREATE TABLE tablename (
        id INTEGER NOT NULL, 
        user VARCHAR NOT NULL, 
        created DATETIME, 
        PRIMARY KEY (id), 
        UNIQUE (user)
    );
  2. Переименовать старую таблицу

    PRAGMA legacy_alter_table=on;
    ALTER TABLE tablename RENAME TO tablename_old ;
  3. Создать новую таблицу

    CREATE TABLE tablename (
        id INTEGER NOT NULL,
        parent_id INTEGER,
        created DATETIME,
        PRIMARY KEY (id)
    );
  4. Скопировать данные из старой таблицы в новую

    INSERT INTO tablename SELECT id, parent_id=NULL, created FROM tablename_old ;
  5. Удалить старую таблицу

    DROP TABLE IF EXISTS tablename_old ;

Вариант III

Через alembic используя костыль

def upgrade():
    op.rename_table('board', 'board_old')
    op.create_table(
        'board',
        sa.Column('id', sa.Integer, primary_key=True),
        sa.Column('project_id', sa.Integer, sa.ForeignKey('project.id')),
        sa.Column('user_id', sa.Integer, sa.ForeignKey('user.id')),
        sa.Column('title', sa.String),
        sa.Column('level', sa.Integer, default=0),
        sa.Column('created', sa.DateTime), # Дата создания
        sa.Column('updated', sa.DateTime) # Дата обновления
    )

    # create the teams table and the players.team_id column
    op.execute("INSERT INTO board (id, project_id, user_id, title, level, created, updated) SELECT id, 1, user_id, title, level, created, updated FROM board_old ;")
    op.drop_table("board_old")

Возможно будут интересны и другие вопросы