Python sqlalchemy按表名和文件服务器条件筛选列表
我正在使用sqlalchemy ORM层与RDS通信。 这是所有表筛选行的常用函数。 我们传递表名、要选择的列、过滤器和日期范围Python sqlalchemy按表名和文件服务器条件筛选列表,python,sql,database,sqlalchemy,Python,Sql,Database,Sqlalchemy,我正在使用sqlalchemy ORM层与RDS通信。 这是所有表筛选行的常用函数。 我们传递表名、要选择的列、过滤器和日期范围 filter={“company\u guid”:“xxxx”,“status”:“Active”} filter是以键作为列名、值为条件的字典。 哪个好用 但知道我想在状态列中筛选,其中的值可以是活动的或临时非活动的 所以现在过滤器变成filter={“company_guid”:“xxxx”,“status”:[“Active”,“TempActive”} 它不工
filter={“company\u guid”:“xxxx”,“status”:“Active”}
filter
是以键作为列名、值为条件的字典。
哪个好用
但知道我想在状态
列中筛选,其中的值可以是活动的
或临时非活动的
所以现在过滤器变成filter={“company_guid”:“xxxx”,“status”:[“Active”,“TempActive”}
它不工作,因为值是列表,而不是字符串。
我知道可以使用result=session.query(Customers.filter)(Customers.id.in_uuz([1,3])
,但在我的场景中,表名和列名是函数参数
def get_items_withvalue(self, table_name, column_name=None, attribute_value=None,
columns_to_select=None, date_value=False, filters=None):
"""
@Summary: This method used to get data based on a condition.
@param table_name (string): This is the table_name
@param column_name (None/string): for the column_name
@param attribute_value (None/list/string): for the column_value
@params columns_to_select(None/list/string): columns to send in response
@params filters(None/dict): where clause for rows to be fetched
@return (list of dict): fetched rows or count from DB
"""
data = []
session = None
try:
# Get session which communicate with RDS
session = self.get_session()
table = str_to_class(table_name)
if columns_to_select:
data = []
else:
if isinstance(attribute_value, list):
data = (session.query(table)
.filter(getattr(table, column_name)
.in_(attribute_value))
.all())
elif date_value:
data = (session.query(table)
.filter(cast(getattr(table, column_name), Date)
== attribute_value)
.all())
elif filters:
## How to update following code to filter on list(in)
# filters is dictionary
data = (session.query(table).filter_by(**filters).all())
##
else:
data = (
session.query(table).filter(getattr(table, column_name)
== attribute_value).all()
)
except Exception as err:
self.logger.exception("Error fetching items ")
raise Exception(err)
finally:
if session:
session.close()
if columns_to_select:
return [row._asdict() for row in data]
return [object_as_dict(row) for row in data]
谁能帮我解决这个问题
一种方法是构造查询字符串并进行求值,但这不是一种好方法。当您使用ORM时,我假设您在函数中调用的
表实际上是一个映射的ORM类
如果我理解正确,您希望能够处理两种情况,过滤器的值可以是标量值(在这种情况下,您希望根据相等性进行过滤),或者是值列表(在这种情况下,您希望使用in_u()测试列表中是否存在值)
。然而,一个复杂的因素是,您不能直接在filter()
中使用str
过滤器的键。希望我已经理解了
我认为您可以通过使用getattr
从表对象中获取列attribs(条件列表理解),然后将列表解压到.filter()
,巧妙地解决这个问题,例如:
filters = {'a': 'scalar', 'and': ['collection', 'of', 'values']}
(
session.query(table).filter(
*[
getattr(table, k).in_(v)
if isinstance(v, list)
else getattr(table, k) == v
for k, v in filters.items()
]
)
)
如果val
不是列表
,这将产生与orm\u table\u object.column\u attrib==val
等价的orm\u table\u object.column\u attrib.in(val)
如果val
是列表
,让我试试看,谢谢