gpt4 book ai didi

python - SQLAlchemy 中的用户定义函数创建

转载 作者:太空狗 更新时间:2023-10-29 21:46:15 24 4
gpt4 key购买 nike

SQLAlchemy 为定义数据库表提供了一个非常干净的界面:

engine = create_engine('sqlite:///:memory:')

metadata = MetaData()

user = Table('user', metadata,
Column('user_id', Integer, primary_key = True),
Column('user_name', String(16), nullable = False),
Column('email_address', String(60), key='email'),
Column('password', String(20), nullable = False)
)

user_prefs = Table('user_prefs', metadata,
Column('pref_id', Integer, primary_key=True),
Column('user_id', Integer, ForeignKey("user.user_id"), nullable=False),
Column('pref_name', String(40), nullable=False),
Column('pref_value', String(100))
)

一旦定义了这些表,就可以很容易地使用 metadata.create_all(engine) 函数创建这些表。当您想要创建不会干扰生产中使用的现有表的表时,这对于测试特别有用。

我目前正在从事的一个项目在很大程度上依赖于 postgres 中的用户定义函数。是否有一种干净的方法可以使用 SQLAlchemy 定义这些函数,以便 metadata.create_all(engine) 正确创建函数以及适当的表?

最佳答案

我今天一直在做类似的事情。到目前为止,我发现最好的方法是使用 sqlalchemy before_create 事件监听器。对于一般功能,您可以将事件绑定(bind)到元数据,但对于表特定功能,您可以绑定(bind)到表。例如:

import sqlalchemy
from sqlalchemy.schema import DDL

sqlalchemy.event.listen(
metadata,
'before_create',
DDL('CREATE OR REPLACE FUNCTION myfunc() ...')
)

如果您想在创建表之前创建函数,您可以只用表替换元数据。

这个 DDL 似乎在您每次调用 metadata.create_all 时都会运行,因此使用 CREATE OR REPLACE 很重要。如果您想更多地控制函数的创建时间,您最好使用 alembic 查看迁移。或类似的。

在此处的 sqlalchemy 文档中描述了 DDL 的一些用途:http://docs.sqlalchemy.org/en/latest/core/ddl.html#custom-ddl

关于python - SQLAlchemy 中的用户定义函数创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27367886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com