在SQLAlchemy中,如何使用声明性语法定义事件来触发DDL?

时间:2012-08-20 13:55:56

标签: python sqlalchemy declarative

此示例显示如何将其与“非声明性” - http://docs.sqlalchemy.org/en/latest/core/ddl.html#sqlalchemy.schema.DDL

一起使用

如何将它与ORM声明性语法一起使用?

例如,使用此结构:

Base = declarative_base(bind=engine)     
class TableXYZ(Base):
    __tablename__ = 'tablexyz'

2 个答案:

答案 0 :(得分:8)

愚蠢的例子,但认为这是你正在寻找的,应该让你去:

from sqlalchemy import event
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import create_session
from sqlalchemy.schema import Column, DDL
from sqlalchemy.types import Integer

Base = declarative_base()
engine = create_engine('sqlite:////tmp/test.db', echo=True)

class TableXYZ(Base):
    __tablename__ = 'tablexyz'
    id = Column(Integer, primary_key=True)

#event.listen(
#   Base.metadata, 'after_create',
#   DDL("""
#   alter table TableXYZ add column name text
#   """)

event.listen(
    TableXYZ.__table__, 'after_create',
    DDL("""
    alter table TableXYZ add column name text
    """)
)
Base.metadata.create_all(engine)

运行上述结果 - 请注意添加列的“名称文字”:

sqlite> .schema tablexyz
CREATE TABLE tablexyz (
    id INTEGER NOT NULL, name text, 
    PRIMARY KEY (id)
);

我在声明中使用了代码,并使用event.listen添加触发器和其他存储过程。似乎运作良好。

答案 1 :(得分:2)

它应与“非声明性”和“声明性”相同。

您可以通过指定(使用您的班级和文档的事件和功能)来注册您的活动:

event.listen(TableXYZ, 'before_create', DDL('DROP TRIGGER users_trigger'))

语法类似于:

event.listen(Class, 'name_of_event', function)
相关问题