Adding primary key to existing MySQL table in alembic

后端 未结 1 767
迷失自我
迷失自我 2021-01-12 02:59

I am trying to add an \'id\' primary key column to an already existing MySQL table using alembic. I tried the following...

op.add_column(\'mytable\', sa.Colu         


        
相关标签:
1条回答
  • 2021-01-12 03:30

    I spent some time digging through the alembic source code, and this doesn't seem to be supported. You can specify primary keys when creating a table, but not when adding columns. In fact, it specifically checks and won't let you (link to source):

    # 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)
    

    I looked around, and adding a primary key to an existing table may result in unspecified behavior - primary keys aren't supposed to be null, so your engine may or may not create primary keys for existing rows. See this SO discussion for more info: Insert auto increment primary key to existing table

    I'd just run the alter query directly, and create primary keys if you need to.

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

    If you really need cross-engine compatibility, the big hammer would be to (1) create a new table identical to the old one with a primary key, (2) migrate all your data, (3)delete the old table and (4) rename the new table.

    Hope that helps.

    0 讨论(0)
提交回复
热议问题