2010-11-05 12 views
4

Je souhaite générer par programme des instructions ALTER TABLE dans SQL Alchemy pour ajouter une nouvelle colonne à une table. La colonne à ajouter doit prendre sa définition à partir d'une classe mappée existante. Par conséquent, étant donné une instance SQL Alchemy Column, puis-je générer les définitions de schéma SQL dont j'ai besoin pour ALTER TABLE ... ADD COLUMN ... et CREATE INDEX ...?SQL Alchemy et génération d'instructions ALTER TABLE

J'ai joué à l'invite de Python et été en mesure de voir une description lisible par l'homme des données que je suis après:

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

Quand j'appelle engine.create_all() le journal de débogage comprend les instructions SQL I » m cherche à générer:

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

Je l'ai entendu parler de sqlalchemy-migrate, mais qui semble être construit autour des changements statiques et je suis à la recherche de générer dynamiquement sche ma-changements.

(je ne suis pas intéressé à défendre cette conception, je suis à la recherche d'un moyen portable dialecte d'ajouter une colonne à une table existante.)

Répondre

1

Après avoir retracé engine.create_all() avec a debugger j'ai découvert un réponse possible:

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

L'index peut être créé avec:

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)