【问题标题】:SQLAlchemy ORM - define custom function in model for selectsSQLAlchemy ORM - 在模型中为选择定义自定义函数
【发布时间】: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 的对象。我在文档中没有发现任何有用的东西。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案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 的项目,它可以很好地避免重复和意大利面条代码)。

    【讨论】:

      猜你喜欢
      • 2015-04-29
      • 1970-01-01
      • 2022-01-12
      • 2018-10-04
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      相关资源
      最近更新 更多