在准备好的语句中使用列表

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 子句中使用 setlist

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 的 executelist 参数非常满意,我发现它更具可读性并且更不容易出错,所以我推荐它:

cur.execute(
    "SELECT model FROM cars WHERE brand = any(%s)", [
    list(BRANDS)
])