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



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

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(获取特定表和行的row_data(:

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

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

您可以创建自己的会话类,可以为以下操作进一步扩展:

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项目中使用SQL Alchemy的方式,它可以很好地避免重复和意大利面条代码(。

最新更新