如何通过python字典中的值过滤sqlalchemy表

时间:2020-05-15 11:53:09

标签: python python-3.x postgresql sqlalchemy

鉴于状态和值的字典,我想过滤表行:

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表的对象,因此以后可以用等效于以下方式的联接和过滤:

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

1 个答案:

答案 0 :(得分:1)

您不能使用数据库外部的表来过滤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')