SQL Alchemy 和生成 ALTER TABLE 语句

Rob*_*obM 5 sqlalchemy

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

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

我在 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>)
Run Code Online (Sandbox Code Playgroud)

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

CREATE TABLE "Chain" (
        ...
        "rName" VARCHAR(40),
        ...
)
CREATE INDEX "ix_Chain_rName" ON "Chain" ("rName")
Run Code Online (Sandbox Code Playgroud)

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

(我对捍卫这种设计不感兴趣,我只是在寻找一种方言可移植的方法来向现有表添加列。)

Rob*_*obM 1

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

>>> engine.dialect.ddl_compiler(
...    engine.dialect,
...    DBChain.__table__.c.rName ) \
... .get_column_specification(
...    DBChain.__table__.c.rName )
'"rName" VARCHAR(40)'
Run Code Online (Sandbox Code Playgroud)

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

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)                                
Run Code Online (Sandbox Code Playgroud)