Alembic列类型更改会导致语法错误

时间:2016-08-29 16:13:02

标签: python sqlalchemy alembic

从Integer到String的其中一个表的Column类型发生了变化。

Logic(PBase):
__tablename__ = "logic"
Id(Integer, primary_key=True)

此列已更改为字符串

Logic(PBase):
__tablename__ = "logic"
Id(String, primary_key=True)

现在我使用alembic自动生成迁移脚本。为了检测类型更改,我在env.py中提供了compare_type = True

 with connectable.connect() as connection:
    context.configure(
        connection=connection,
        target_metadata=target_metadata,
        compare_type=True
    )

这样做,可以很好地生成迁移脚本。以下是生成的迁移脚本的内容:

from alembic import op       # noqa
import sqlalchemy as sa      # noqa


def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('logics', 'id',
                    existing_type=sa.INTEGER(),
                    type_=sa.String())
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('logics', 'id',
                    existing_type=sa.String(),
                    type_=sa.INTEGER())
    ### end Alembic commands ###

但是当我运行升级命令时,我收到语法错误(这是追溯的结束部分):

  

文件   " /Users/amit/.virtualenvs/be_new/lib/python2.7/site-packages/sqlalchemy/engine/default.py" ;,   第436行,在do_execute中       cursor.execute(语句,参数)sqlalchemy.exc.OperationalError :( OperationalError)" ALTER":   语法错误u' ALTER TABLE逻辑ALTER COLUMN id TYPE VARCHAR' ()

这可能是什么问题?

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我用以下语法解决了这个问题:

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('logics', 'id', type_=sa.String, existing_type=sa.INTEGER)
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('logics', 'id', type_=sa.INTEGER, existing_type=sa.VARCHAR)
    ### end Alembic commands ###

基本上我在类型声明之后省略了括号,在downgrade上我使用了类型VARCHAR,因为String不是SQL类型。