问题描述
我正在尝试创建一个函数,该函数可以使用带有可选参数的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变量,它每次都会返回一个空表
我尝试使用** 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