SQL Alchemy并生成ALTER TABLE语句

时间:2010-11-05 14:41:58

标签: sqlalchemy

我想在SQL Alchemy中以编程方式生成ALTER TABLE语句,以向表中添加新列。要添加的列应从现有的映射类中进行定义。

因此,给定一个SQL Alchemy Column实例,我可以生成ALTER TABLE ... ADD COLUMN ...CREATE INDEX ...所需的SQL模式定义吗?

我在Python提示符下玩过,并且能够看到我所追求的数据的可读描述:

>>> DBChain.__table__.c.rName
Column('rName', String(length=40, convert_unicode=False, assert_unicode=None, unicode_error=None, _warn_on_bytestring=False), table=<Chain>)

当我调用engine.create_all()时,调试日志包含我想要生成的SQL语句:

CREATE TABLE "Chain" (
        ...
        "rName" VARCHAR(40),
        ...
)
CREATE INDEX "ix_Chain_rName" ON "Chain" ("rName")

我听说过sqlalchemy-migrate,但这似乎是围绕静态更改构建的,我希望动态生成架构更改。

(我对保护这个设计不感兴趣,我只是在寻找一种方言可移植的方法来将列添加到现有表中。)

2 个答案:

答案 0 :(得分:1)

使用a debugger跟踪engine.create_all()后,我发现了一个可能的答案:

>>> engine.dialect.ddl_compiler(
...    engine.dialect,
...    DBChain.__table__.c.rName ) \
... .get_column_specification(
...    DBChain.__table__.c.rName )
'"rName" VARCHAR(40)'

可以使用以下命令创建索引:

sColumnElement = DBChain.__table__.c.rName
if sColumnElement.index:                                   
    sIndex = sa.schema.Index(                              
            "ix_%s_%s" % (rTableName, sColumnElement.name),
            sColumnElement,                                
            unique=sColumnElement.unique)                  
    sIndex.create(engine)                                

答案 1 :(得分:0)

您应该正确迁移数据库内容:

flask db stamp head
flask db migrate
flask db upgrade