Python SQLAlchemy中的用户定义函数创建
SQLAlchemy为定义数据库表提供了一个非常干净的界面:Python SQLAlchemy中的用户定义函数创建,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,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('
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))
)
一旦定义了这些表,就可以很容易地使用元数据创建这些表。create_all(engine)
函数。当您希望创建不会干扰生产中使用的现有表的表时,这对于测试尤其有用
我目前从事的一个项目在很大程度上依赖于postgres中的用户定义函数。有没有一种干净的方法可以使用SQLAlchemy来定义这些函数,以便
元数据。create_all(engine)
可以正确地创建函数以及相应的表?我今天一直在做类似的工作。到目前为止,我发现最好的方法是在创建事件侦听器之前使用sqlalchemy。对于常规函数,可以将事件绑定到元数据,但是对于特定于表的函数,可以绑定到表。例如:
import sqlalchemy
from sqlalchemy.schema import DDL
sqlalchemy.event.listen(
metadata,
'before_create',
DDL('CREATE OR REPLACE FUNCTION myfunc() ...')
)
如果要在创建表之前创建函数,可以用表替换元数据
此DDL似乎在每次调用元数据时都会运行。请全部创建,因此使用创建或替换非常重要。如果您希望对函数的创建时间有更多的控制,那么最好考虑使用或类似的方法进行迁移
sqlalchemy文档中描述了DDL的一些用法: