我知道SO不是“调试我的代码服务”,但在检查并重试几个小时后,要么我错过了一些非常愚蠢的东西,要么我的MySQLdb中存在错误(或错误的编译)模块...
我还有一些相关的问题与发布的代码一起提出......
def NextDocumentIdToCache():
if not OpenConnection():
return 0
# ...setting string values... #
cur = connection.cursor(mysql.cursors.DictCursor)
cur.execute('SELECT * FROM documents WHERE resolutions <> %s AND pdf > 0 AND status = %s AND expire > %s AND locked = %s LIMIT 0,1', (resolutions, status, expireLimit, ''))
rowsCount = cur.rowcount
if rowsCount==0:
return 0
row = cur.fetchone()
id = row['document_id']
从现在开始一切都好。连接打开,我获取一行并检索函数末尾返回的正确 id。
然后我需要对获取的行执行更新操作...
cur.close()
cur = connection.cursor(mysql.cursors.Cursor)
我已关闭光标并打开一个新光标。 我真的需要这样做吗?或者我可以重复使用相同的光标吗?
cur.execute("""UPDATE documents SET locked = %s WHERE document_id = %s""", ("worker: rendering pages", id))
这实际上不会更新该行。没有异常(exception)发生,只是不起作用。
函数终于结束了...
cur.close()
return id
还有几个问题。
有什么区别
cur.execute("""UPDATE documents....
和
cur.execute("UPDATE documents....
这两个版本我都见过。三重双引号、单双引号、单单引号之间的功能区别是什么?
最后
如果我编写查询
cur.execute("""UPDATE documents SET locked = %s WHERE document_id = %d""", ("worker: rendering pages", id))
(请注意 %d 而不是 %s)我收到错误。但我已经检查过 id 是一个长整数。那么出了什么问题?
谢谢
最佳答案
更改未生效:
您正在进行交易吗?如果是这种情况,您需要 commit()
。 PEP 249定义了 Python 数据库 API,规定连接将使用事务,即使您没有显式启用它们:“请注意,如果数据库支持自动提交功能,则必须首先关闭该功能。”
引用
三引号字符串是多行,单引号字符串不是。
插值
因为这实际上并不是字符串插值。这些占位符由 MySQLdb 解释,它将为您处理引用。
关于Python,MySQLdb,无法更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19067776/