我想以编程方式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,但这似乎是围绕静态更改构建的,我希望动态生成架构更改。
(我对捍卫这种设计不感兴趣,我只是在寻找一种方言可移植的方法来向现有表添加列。)
使用调试器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)
归档时间: |
|
查看次数: |
2943 次 |
最近记录: |