SQL Alchemy и генерация операторов ALTER TABLE - PullRequest
4 голосов
/ 05 ноября 2010

Я хочу программно сгенерировать 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>)

Когда я звоню engine.create_all() журнал отладки включает в себя операторы SQL, которые я ищу для генерации:

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

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

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

1 Ответ

1 голос
/ 05 ноября 2010

После трассировки 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)                                
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...