Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlalchemy按表名和文件服务器条件筛选列表_Python_Sql_Database_Sqlalchemy - Fatal编程技术网

Python sqlalchemy按表名和文件服务器条件筛选列表

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”} 它不工

我正在使用sqlalchemy ORM层与RDS通信。 这是所有表筛选行的常用函数。 我们传递表名、要选择的列、过滤器和日期范围

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
列表
,让我试试看,谢谢