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

SQLAlchemy ORM - define custom function in model for selects

如何为模型定义自定义过滤器函数,这样我就不会在我的应用程序中重复它? 我的意思是如果我有这样的模型:

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)

我经常使用这样的 select(针对特定的 table 和行获取 row_data):

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

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

您可以创建自己的会话 class,您可以像这样进一步扩展这些操作:

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)

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