1

我有一个从复选框获取用户输入并从 MySQL 表中返回相应行的网站。

例如,用户可以选择几种颜色,网站将显示表格中具有该颜色的对象。

问题是当用户只选择一种颜色时,MySQL 查询没有正确创建,我得到一个错误。注意colors下面的数组:

所以这有效:

import MySQLdb
db = MySQLdb.connect(host="...", user="...", port=..., db="...", passwd="...")
colors = ["red", "blue"]
cursor.execute("SELECT * FROM `objects` WHERE `color` IN %s",(colors,))

这不会:

import MySQLdb
db = MySQLdb.connect(host="...", user="...", port=..., db="...",passwd="...")
colors = ["red"]
cursor.execute("SELECT * FROM `objects` WHERE `color` IN %s", (colors,))

有没有办法纠正这个问题?现在,我暂时添加了一种虚假的“颜色”(在数据库中没有与之链接的对象),但这显然不是一个理想的解决方案。

4

2 回答 2

0

您可以使用 .join 运算符。

colors = ["red", "blue"]
colors = ",".join(colors)

output:'red,blue'

colors = ["red"]
colors = ",".join(colors)

output: 'red'

所以代码看起来像

import MySQLdb as mdb
con = mdb.connect('', '','','')
with con:
    cur = con.cursor(mdb.cursors.DictCursor)
    colors = ["red","blue"]
    query = """SELECT * FROM objects where color in (""" + ",".join(colors) + """)
    cur.execute(users_query)
    rows = cur.fetchall()
于 2013-02-21T11:28:34.903 回答
0

你应该确认你的 MySQLdb egg 版本,我之前遇到过这个问题,这个库使用 connection.literal(o) 来处理这样的 sql 值:

sql = "select * from test where id in %s"
sql_val = [100]
# get connection and cur 
cur.execute(sql, tuple([sql_val]))
# see the last query sql 
cur._last_executed

# version MySQL_python-1.2.3c1-py2.6-linux-x86_64.egg execute exception and the query sql is:
# attention to the last comma after '100' 
select * from test where id in ('100',)

# version MySQL_python-1.2.3c1-py2.6-linux-x86_64.egg execute successfully and the query sql is:
# have no comma after '100' now 
select * from test where id in ('100')

所以,也许你应该将你的 MySQLdb egg 升级到最新版本来修复它。

于 2015-05-06T12:09:34.833 回答