Добавление первичного ключа в существующую таблицу MySQL в перегонном кубе

Я пытаюсь добавить столбец первичного ключа «id» в уже существующую таблицу MySQL, используя перегонный куб. Я попробовал следующее...

op.add_column('mytable', sa.Column('id', sa.Integer(), nullable=False))
op.alter_column('mytable', 'id', autoincrement=True, existing_type=sa.Integer(), existing_server_default=False, existing_nullable=False) 

но получил следующую ошибку

sqlalchemy.exc.OperationalError: (OperationalError) (1075, 'Incorrect table definition; there can be only one auto column and it must be defined as a key') 'ALTER TABLE mytable CHANGE id id INTEGER NOT NULL AUTO_INCREMENT' ()

похоже, что оператор sql, сгенерированный alembic, не добавил PRIMARY KEY в конце оператора alter. Может я пропустил какие-то настройки?

Заранее спасибо!


person minovsky    schedule 07.12.2012    source источник


Ответы (1)


Я провел некоторое время, копаясь в исходном коде перегонного куба, и, похоже, это не поддерживается. Вы можете указать первичные ключи при создании таблицы, но не при добавлении столбцов. На самом деле специально проверяет и не пускает (ссылка на источник):

# from alembic.operations.toimpl.add_column, line 132
for constraint in t.constraints:
    if not isinstance(constraint, sa_schema.PrimaryKeyConstraint):
        operations.impl.add_constraint(constraint)

Я осмотрелся, и добавление первичного ключа в существующую таблицу может привести к неуказанному поведению — первичные ключи не должны быть нулевыми, поэтому ваш движок может создавать или не создавать первичные ключи для существующих строк. См. это обсуждение SO для получения дополнительной информации: существующая таблица

Я бы просто запустил запрос на изменение напрямую и создал бы первичные ключи, если вам нужно.

op.execute("ALTER TABLE mytable ADD id INT PRIMARY KEY AUTO_INCREMENT;")

Если вам действительно нужна кросс-машинная совместимость, большой молоток будет состоять в том, чтобы (1) создать новую таблицу, идентичную старой, с первичным ключом, (2) перенести все ваши данные, (3) удалить старую таблицу и (4) ) переименуйте новую таблицу.

Надеюсь, это поможет.

person Rachel Sanders    schedule 07.12.2012