Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy中的用户定义函数创建_Python_Postgresql_Sqlalchemy - Fatal编程技术网

Python 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('

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))
)
一旦定义了这些表,就可以很容易地使用
元数据创建这些表。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的一些用法: