2010-11-05 4 views
4

Я хочу программно сгенерировать операторы ALTER TABLE в SQL Alchemy, чтобы добавить новый столбец в таблицу. Столбец, который нужно добавить, должен взять свое определение из существующего сопоставленного класса.SQL Алхимия и генерация операторов ALTER TABLE

Итак, учитывая экземпляр 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>) 

Когда я звоню engine.create_all() журнал отладка включает операторы SQL I» м надеются генерировать:

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

Я слышал sqlalchemy-migrate, но это, кажется, будет построено вокруг статических изменений, и я ищу, чтобы динамически генерировать ЩЭ ма-изменения.

(Я не заинтересован в защите этого проекта, я просто смотрю на диалект переносного способа добавить столбец в существующей таблицу.)

ответ

1

После трассировки engine.create_all() с a debugger я обнаружил возможный ответ:

>>> 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)