此示例显示如何将其与“非声明性”一起使用 - http://docs.sqlalchemy.org/en/latest/core/ddl.html#sqlalchemy.schema.DDL
如何将它与 ORM 声明式语法一起使用?
例如,使用这种结构:
Base = declarative_base(bind=engine)
class TableXYZ(Base):
__tablename__ = 'tablexyz'
此示例显示如何将其与“非声明性”一起使用 - http://docs.sqlalchemy.org/en/latest/core/ddl.html#sqlalchemy.schema.DDL
如何将它与 ORM 声明式语法一起使用?
例如,使用这种结构:
Base = declarative_base(bind=engine)
class TableXYZ(Base):
__tablename__ = 'tablexyz'
愚蠢的例子,但认为这是你正在寻找的,应该让你去:
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 添加触发器和其他存储过程。似乎运作良好。
“非声明式”和“声明式”应该是一样的。
您通过指定(使用您的班级和文档的事件和函数)来注册您的事件:
event.listen(TableXYZ, 'before_create', DDL('DROP TRIGGER users_trigger'))
语法类似于:
event.listen(Class, 'name_of_event', function)