Я хочу добавить столбец с автоинкрементом, который не является первичным ключом к существующей базе данных MySQL.
Команда, введенная на сервере, необходимая для этой операции, следующая:
ALTER TABLE `mytable` ADD `id` INT UNIQUE NOT NULL AUTO_INCREMENT FIRST
Проблема, с которой я сталкиваюсь, заключается в том, как реплицировать это изменение таблицы посредством миграции Alembic. Я пробовал:
from alembic import op
import sqlalchemy as sa
def upgrade():
op.add_column('mytable', sa.Colummn('id', sa.INTEGER(),
nullable=False, autoincrement=True)
но когда я пытаюсь вставить строку следующей командой:
INSERT INTO `mytable` (`col1`, `col2`) VALUES (`bar`);
, где col1
, col2
- столбцы, не допускающие значения NULL. Когда я вставляю эту запись, я ожидаю, что таблица автоматически сгенерирует для меня идентификатор.
ERROR 1364 (HY000): Field 'id' doesn't have a default value
Если я проверяю sql, автоматически сгенерированный Alembic, используя следующую команду:
alembic upgrade 'hash-of-revision' --sql
выплевывает, для данной ревизии:
ALTER TABLE mytable ADD COLUMN id INTEGER NOT NULL;
Это означает, что Alembic или SQLAlchemy игнорируют поле autoincrement
при создании sql миграции.
Есть ли способ, которым я могу решить это? Или я могу установить миграцию на основе пользовательской команды sql?