我正在使用Python和MySQLdb库。这是代码的一部分,该代码已经工作了很长时间。
我正在测试代码是否在其他Ubuntu版本中正确执行,因为我们正计划进行SO升级。
以下代码在Ubuntu 12.04(我们的基本系统现在使用Python 2.7.3),Ubuntu 14.04.5(Python 2.7.6)中运行良好,但在Ubuntu 16.04.1(Python 2.7.12)中没有:
def updateOutputPath(path):
try:
# Connect to database
with closing(MySQLdb.connect(host=Constants.database_host,
user=Constants.database_user, passwd=Constants.database_passwd,
db=Constants.database_name)) as db:
# Create a cursor to execute queries
with closing(db.cursor()) as cursor:
# Execute query
cursor.execute('UPDATE configuration SET value=%s WHERE ' +
'property=\'OUTPUT_PATH\'', (path))
# Save changes in the database and close connection
db.commit()
except MySQLdb.Error, e:
print_exception('Database error', e)
print_db_query(cursor)
在cursor.execute
语句中,我收到以下错误:并非在字符串格式化过程中转换了所有参数。
显然,我检查过唯一的参数是描述有效路径的有效字符串,就像在其他SO版本中执行一样。
我可以创建一个字符串并将其传递给cursor.execute
语句,问题就会结束,但我很好奇这个问题。
知道为什么吗?
我也认为它可能与python-mysqldb库版本有关,而与Python版本无关。其版本在Ubuntu 12.04中为1.2.3-1,在Ubuntu 14.04中为1.2.3-2,在Ubuntu 16.04中为1.3.7-1(我假设此更新与此OS版本中Mysql-server 5.7的使用有关)
答案 0 :(得分:0)
传递的参数需要是迭代的,即列表或元组。所以它应该是(path,)
而不是(path)
cursor.execute('UPDATE configuration SET value=%s WHERE ' +
'property=\'OUTPUT_PATH\'', (path,))
>>> path = 'hello'
>>> a = (path)
>>> type(a)
<type 'str'>
>>> b = (path,)
>>> type(b)
<type 'tuple'>
>>> for x in a:
... print(x)
...
h
e
l
l
o
>>> for x in b:
... print(x)
...
hello
如果你传递(path
),它将是作为路径字符串的每个字符迭代的字符串,而不是元组的项目,正确的元组格式是(path,))