2010-11-05 111 views
4

我想在SQL Alchemy中以编程方式生成ALTER TABLE语句以将新列添加到表中。要添加的列应该从现有的映射类中进行定义。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,但似乎周围的静态变化要建,我期待动态生成血清胆碱酯酶MA-变化。

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

回答

1

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

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)         

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

索引可以被创建