[英]How to filter sqlalchemy table by values from python dictionary
给定具有状态和值的字典,我想过滤表行:
my_join_data = [
{
"status": "status0",
"value": 20,
},
{
"status": "status1",
"value": 25,
},
]
表值:
id status value
0 status0 10
1 status0 25
2 status0 30
3 status1 10
4 status1 35
my_join_data 取自外部源,因此无法存储到数据库中。 我想将 my_join_data 转换为 sqlalchemy 类似 object 的表,所以我可以在之后以等效于的方式进行连接和过滤:
joined_table = my_table.join(
my_join_data,
my_join_data.c.status == my_table.c.status
)
query = sqlalchemy.select([
my_table.c.id,
my_table.c.status,
my_table.c.value,
]).select_from(
joined_table
).where(
my_join_data.c.value < my_table.c.value
)
预期的结果是
id status value
1 status0 25
2 status0 30
4 status1 35
有什么办法可以做到这一点? 数据库为 PostgreSQL
您无法使用来自数据库外部的表在 sqlalchemy 语句中过滤 SQL 表,而无需上传或编写复杂的 case 语句。
您可以将 join_data 和 SQL 表加载到 Pandas DataFrames 中,然后加入和过滤。
首先,我会将字典列表压缩为一个字典。
status_list = []
value_list = []
for dict in my_join_data:
status_list.append(dict["status"])
value_list.append(dict["value"])
join_dict = {'status': status_list, 'value': value_list}
然后将两者读入 DataFrame。
import pandas as pd
join_df = pd.DataFrame.from_dict(join_dict)
sql_df = pd.read_sql_query(query, engine)
然后合并两者并过滤。
merged_df = sql_df.merge(join_df, how='left', on='status', suffixes=('', '_filter'))
filtered_df = merged_df.loc[merged_df['value_filter'] < merged_df['value']]
filtered_df.drop(columns='value_filter')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.