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

Python 在SQLAlchemy中,如何使用声明性语法定义触发DDL的事件?,python,sqlalchemy,declarative,Python,Sqlalchemy,Declarative,此示例演示如何将其与“非声明性”一起使用- 如何将其与ORM声明性语法结合使用 例如,使用此结构: Base=declarative\u Base(bind=engine) 类TableXYZ(基): __tablename_uuz='tablexyz' 它应该与“非声明性”和“声明性”相同 您可以通过指定(与您的类和文档的事件和函数一起)来注册事件: 语法类似于: event.listen(Class, 'name_of_event', function) 愚蠢的例子,但认为这是你正在寻找的

此示例演示如何将其与“非声明性”一起使用-

如何将其与ORM声明性语法结合使用

例如,使用此结构:

Base=declarative\u Base(bind=engine)
类TableXYZ(基):
__tablename_uuz='tablexyz'

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

您可以通过指定(与您的类和文档的事件和函数一起)来注册事件:

语法类似于:

event.listen(Class, 'name_of_event', function)

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

来自sqlalchemy导入事件的

从sqlalchemy.engine导入创建引擎
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy.orm导入创建会话
从sqlalchemy.schema导入列,DDL
从sqlalchemy.types导入整数
Base=声明性_Base()
引擎=创建引擎('sqlite:////tmp/test.db,echo=True)
类TableXYZ(基):
__tablename_uuz='tablexyz'
id=列(整数,主键=True)
#听我说(
#Base.metadata“创建后”,
#DDL(“”)
#alter table XYZ添加列名文本
#   """)
听我说(
TableXYZ.uuuu table_uuuuuuuuuuuuuuuuuuuu“创建”之后,
DDL(“”)
alter table XYZ添加列名文本
""")
)
Base.metadata.create_all(引擎)
运行上述操作会导致添加列出现-注意“名称文本”:

sqlite>.schema tablexyz
创建表tablexyz(
id整数不为空,名称文本,
主键(id)
);

我的代码是声明式的,并使用事件。请听添加触发器和其他存储过程。似乎工作得很好。

恐怕没有骰子……我收到了错误“sqlalchemy.exc.InvalidRequestError:no'before_create'for target”这是一个很好的首次尝试……但我真的希望在创建过程中有更精细的粒度-即(我还没有运行您的代码),但我可以想象,它会在元数据列表中的任何表被创建后触发DDL,而我更喜欢在一个表一个表的级别上执行此操作(因为我可能会修改一些模式,不想删除并重新创建每个表上的每个触发器).在+方面..您至少提出了一个工作选项…添加了一些更精细的粒度控制(表级)的示例。
event.listen(Class, 'name_of_event', function)