我想在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,但这似乎是围绕静态更改构建的,我希望动态生成架构更改。
(我对保护这个设计不感兴趣,我只是在寻找一种方言可移植的方法来将列添加到现有表中。)
答案 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