如何在SQLAlchemy中动态使用select?

问题描述

我正在尝试创建一个函数,该函数可以使用带有可选参数的sqlAlchemy过滤sql表。

功能

def fetch_new_requests(status,request_type,request_subtype,engine,id_r=None):
        table = Table('Sample_Table',Metadata,autoload=True,autoload_with=engine)
        
        query = session.query(load_requests).filter_by(status = status,request_type = request_type,request_subtype = request_subtype,id_r = id_r)
        return pd.read_sql((query).statement,session.bind)

但是如果我没有定义id_r变量,它每次都会返回一个空表

我已经用Google搜索,但是找不到解决方法

我尝试使用** kwargs,但这并不是我真正需要的,我的意思是在这里我必须明确定义列名,然后再次使用id_r来解决问题

def fetch_new_requests(**kwargs):
    
    for x in kwargs.values():
        query = session.query(load_requests).filter_by(status=x)
    return pd.read_sql((query).statement,session.bind)

我理想的结果

def fetch_new_requests(any column names,values of the columns):
    
    for x in kwargs.values():
        query = session.query(load_requests).filter_by(column_name=column_value)
    return pd.read_sql((query).statement,session.bind)

在理论上,我可以使用2个列表或一个字典,但是如果有其他解决方案,我们很乐意听到

解决方法

我只能为您提供有关SQLAlchemy核心语法的答案,但是它可以与字典配合使用!它的键中包含列名称,值中包含它们的必需值。

table = Table('Sample_Table',metadata,autoload=True,autoload_with=engine)
query = table.select()
where_dict = {"status": 1,"request_type": "something"}
for k,v in where_dict.items():
    query = query.where(getattr(table.c,k) == v)

仅出于完整性考虑:这是仅选择特定字段的语法(您的问题听起来像您也在寻找该字段):

query = table.select().with_only_columns(select_columns)  # select_columns is a list