在准备好的语句中使用列表
Use a list in prepared statement
我想在我的 execute
中使用 Python list
(实际上是 set
),但我不太明白。
BRANDS = {
'toyota',
'ford',
'dodge',
'spyker'
}
cur = connection.cursor()
cur.execute("SELECT model FROM cars WHERE brand IN (%s)", (list(BRANDS),)
如何在 psycopg2 的 IN
子句中使用 set
或 list
?
psycopg2 将列表转换为 数组,而 (%s)
表示元组中的单个值,因此这显然是不正确的。
你想要做的是:
- 让postgres将元组转换为元组
cur.execute("SELECT model FROM cars WHERE brand IN %s", (tuple(BRANDS),))
- 对数组使用数组运算符
cur.execute("SELECT model FROM cars WHERE brand = any(%s)", (list(BRANDS),))
性能应该是相当的,我通常推荐=any()
,因为打字更有意义即使参数为空也能工作,postgres [=26] =]not 像空元组,所以 brand in ()
会产生错误。 brand = any('{}')
然而工作正常。
哦,psycogp2 的 execute
对 list 参数非常满意,我发现它更具可读性并且更不容易出错,所以我推荐它:
cur.execute(
"SELECT model FROM cars WHERE brand = any(%s)", [
list(BRANDS)
])
我想在我的 execute
中使用 Python list
(实际上是 set
),但我不太明白。
BRANDS = {
'toyota',
'ford',
'dodge',
'spyker'
}
cur = connection.cursor()
cur.execute("SELECT model FROM cars WHERE brand IN (%s)", (list(BRANDS),)
如何在 psycopg2 的 IN
子句中使用 set
或 list
?
psycopg2 将列表转换为 数组,而 (%s)
表示元组中的单个值,因此这显然是不正确的。
你想要做的是:
- 让postgres将元组转换为元组
cur.execute("SELECT model FROM cars WHERE brand IN %s", (tuple(BRANDS),))
- 对数组使用数组运算符
cur.execute("SELECT model FROM cars WHERE brand = any(%s)", (list(BRANDS),))
性能应该是相当的,我通常推荐=any()
,因为打字更有意义即使参数为空也能工作,postgres [=26] =]not 像空元组,所以 brand in ()
会产生错误。 brand = any('{}')
然而工作正常。
哦,psycogp2 的 execute
对 list 参数非常满意,我发现它更具可读性并且更不容易出错,所以我推荐它:
cur.execute(
"SELECT model FROM cars WHERE brand = any(%s)", [
list(BRANDS)
])