【问题标题】:User defined function creation in SQLAlchemySQLAlchemy 中的用户定义函数创建
【发布时间】:2015-02-06 16:37:06
【问题描述】:

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) 正确创建函数以及相应的表?

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2014-09-21
      • 2010-09-15
      • 1970-01-01
      • 2018-09-16
      • 2011-12-13
      相关资源
      最近更新 更多