【问题标题】:Multiple In statements in SQL through python通过python在SQL中使用多个In语句
【发布时间】:2015-07-12 11:44:37
【问题描述】:

目前我正在通过 python 运行 sql 查询以从数据库中提取信息。

我的代码是:

cities = ('London')
sql = 'SELECT * FROM Customers WHERE City IN ({});'
cur.execute(sql, cities)

我现在想添加一个额外的 IN 语句,这样我的 sql 查询将如下所示:

coun = ('uk')
cities = ('london')
sql = 'SELECT * FROM Customers WHERE City IN ({}) AND Country IN ({});'
cur.execute(sql, cities, coun)

此代码不起作用,因为我在执行命令中指定了两个变量列表,但我也想知道 SQL 是否不喜欢有两个 IN 语句?我试图单独测试它,但它不喜欢两个 IN 语句。

有没有办法让这个代码工作?我正在运行 python 2.7 和 sqlite3 模块。每个用户输入的城市和县列表可能会发生变化,因此我不能只将原始值放入 SQL 语句中。

【问题讨论】:

  • 什么是cur,您阅读过该类和execute 方法的文档吗?你为什么在括号中声明你的字符串? ('london') == 'london'如果要创建元组文字,需要使用逗号('london',)
  • 这不是 SQL 问题。多个 IN 语句没有问题。该问题必须与citiescoun 与相应参数标记的绑定有关。

标签: python sql sqlite


【解决方案1】:

一种方法是首先建立正确数量的所需“?”选择查询字符串中的值,使用 councities 元组的长度(我将它们设为元组,而不是问题中显示的带括号的字符串)。

这不容易受到 sql 注入攻击,因为您只是在对用户数据的查询中格式化问号字符。

之后,您可以简单地组合 councities 元组并将其传递给 execute

import sqlite3
from itertools import repeat

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create TABLE Customers (Name, City, Country)")

companylist = [
    ("Microsoft", "Redmond", "United States"),
    ("BSkyB", "London", "UK"),
    ("Freesat", "London", "UK"),
    ("BBC", "Manchester", "UK"),
    ("Aqsacom", "Melbourne", "Australia"),
    ('Blah', 'London', 'Canada')
]

# multiple case
#coun = ('UK', 'Australia')
#cities = ('London', 'Melbourne')

# single case
coun = ('UK',)
cities = ('London',)


def makeqmarks(i):
    return ', '.join(repeat('?', i))

for company in companylist:
    cur.execute("INSERT INTO Customers Values (?,?,?)", company)

sql = 'SELECT * FROM Customers WHERE City IN (%s) AND Country IN (%s);' \
% (makeqmarks(len(cities)), makeqmarks(len(coun)))

cur.execute(sql, cities + coun)

for res in cur.fetchall():
    print(res)

我不是 sql 专家,因此我希望能就这种方法的任何缺点提供反馈。

【讨论】:

  • 似乎做了我需要它做的事情。你有没有找到不这样做的理由?
  • 不,我没有。好像还好。
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 2020-06-06
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多