正在检查psycopg2/postgresq中是否存在python值列表

2024-10-04 05:33:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python值列表和一个包含特定列的postgresql表。我想知道python列表中每个元素的表中是否有具有该ID的行

例如,假设我有这个python列表:

vals = [4, 8, 15, 16, 23, 42]

还有一个问题是:

^{pr2}$

给出:

[4, 5, 6, 7, 8]

然后我希望查询返回:

[True, True, False, False, False, False]

我可以循环查看列表并为每个值执行一个新的“selectexists”,但是我想知道是否有一种方法可以在一次调用中完成它?在

我只能使用postgresql 9.0


Tags: 方法idfalsetrue元素列表postgresqlvals
2条回答

这个问题更多的是关于SQL而不是aboytpython或psycopg。我会用这样的查询:

SELECT my_col = ANY(your_array_here) FROM my_table;

以“表格顺序”或:

^{pr2}$

以获得“VAL订单”中的结果。在

幸运的是,psycopg提供了一个默认适配器,可以将Python列表转换为PostgreSQL数组,代码非常简单:

curs.execute("SELECT my_col = ANY(%s) from my_table", (vals,))

或者:

curs.execute("""SELECT A.x = ANY(SELECT my_col FROM my_table) 
                  FROM (SELECT * FROM unnest(%s) x) A""", (vals,))

请注意,绑定变量参数应该是dict或元组,并且您希望将完整列表绑定到查询中的单个变量,这意味着您应该使用1元素元组((vals,)),而不是直接传递vals。在

我认为这需要混合使用字符串格式和占位符(因为在vals中,每个项目需要一个%s):

vals = [4, 8, 15, 16, 23, 42]

query = 'select distinct(my_col) from my_table where my_col in ('
query += ', '.join(['%s'] * len(vals))
query += ')'

cursor.execute(query, vals)
theset = {t[0] for t in cursor.fetchall()}

theboollist = [v in theset for v in vals]

这种方法应该保证发送给DB的数据量(对于where ... in子句)和从中得到的数据量都是O(N),其中N等于{};我认为逻辑上不可能比big-O更好。在

相关问题 更多 >