SQLAlchemy ORM - 在模型中为选择定义自定义函数

Posted

技术标签:

【中文标题】SQLAlchemy ORM - 在模型中为选择定义自定义函数【英文标题】:SQLAlchemy ORM - define custom function in model for selects 【发布时间】:2022-01-22 08:04:20 【问题描述】:

如何为模型定义自定义过滤器功能,这样我就不会在我的应用程序中复制它? 我的意思是,如果我有一些模型,像这样:

class DataTables(Base):
    __tablename__ = 'datatables'
    id = Column(Integer, primary_key=True, autoincrement=False)
    table_name = Column(String(50))
    row_id = Column(String(50))
    row_data = Column(BLOB)

我经常使用这样的选择(获取特定表和行的row_data):

session.execute(select(DataTables.row_data).where(DataTables.table_name == table_name, DataTables.row_id == row_id))

我不想使用 ActiveRecord mixin,我可以在模型中获取会话。所以我想做一些函数,它将获得 2 个参数并返回 session.execute 的对象。我在文档中没有发现任何有用的东西。

【问题讨论】:

【参考方案1】:

您可以创建自己的会话类,您可以进一步扩展这些操作,如下所示:

class DataTablesSesssion:
    def __init__(session):
        self.session = session

    def get_row_data_by_name_and_row_id(table_name, row_id):
        return self.session.execute(
           select(DataTables.row_data)
           .where(
               DataTables.table_name == table_name, 
               DataTables.row_id == row_id
           )
        )
    
    def get_some_other_kind_of_data(some_variable):
        ...

然后你可以在你的代码中使用它

data_tables_session = DataTablesSession(session)
row_data = data_tables_session.get_row_data_by_name_and_row_id("name", 1)

some_other_kind_of_data = data_tables_session.get_some_other_kind_of_data(42)

随着您的应用程序增长并且您有更多使用数据库连接的模型和模块,为每个模块拥有这种类型的会话对象将使您的模型和数据库交互代码之间有很好的分离(这就是我在一个 30k LOC 的项目,它可以很好地避免重复和意大利面条代码)。

【讨论】:

以上是关于SQLAlchemy ORM - 在模型中为选择定义自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

Python 9 sqlalchemy ORM

SqlAlchemy ORM

python ORM框架:SqlAlchemy

Python开发:ORM sqlalchemy

SQLAlchemy

Python_Day13_ORM sqlalchemy