首页 > 解决方案 > 使用 SELECT 语句执行值

问题描述

我正在使用表合并来根据参数元组列表从我的数据库中选择项目。查询工作正常,但cur.fetchall()没有返回我想要的整个表。

例如:

data = (
    (1, '2020-11-19'),
    (1, '2020-11-20'),
    (1, '2020-11-21'),
    (2, '2020-11-19'),
    (2, '2020-11-20'),
    (2, '2020-11-21')
)
        
query = """
    with data(song_id, date) as (
        values %s
    )
    select t.*
    from my_table t
    join data d 
    on t.song_id = d.song_id and t.date = d.date::date
"""
execute_values(cursor, query, data)
results = cursor.fetchall()

在实践中,我要检查的元组列表有数千行长,我希望响应也有数千行长。

但是如果我cur.fetchall()在这个请求结束时打电话,我只会得到 5 行。

我知道这是因为execute_values批处理请求,但有一些奇怪的行为。

如果我通过page_size=10了,那么我会拿回 2 件物品。如果我设置fetch=True了,那么我根本不会得到任何结果(即使rowcount不匹配)。

我的想法是批量处理这些请求,但page_size批次的数量与我期望每批的项目数量不匹配。

我应该如何更改此请求,以便获得我期望的所有结果?

标签: pythonsqlpython-3.xpsycopg2

解决方案


推荐阅读