1

我知道 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))

这实际上不会更新该行。没有例外发生,只是不工作。

终于函数结束了……

    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是一个长整数,我已经检查过了。那么有什么问题呢?

谢谢

4

1 回答 1

2

更改不生效:

你在做交易吗?如果是这种情况,您将需commit()要这样做。定义 Python 数据库 API 的PEP 249指出,即使您没有明确启用它们,连接也将使用事务:“请注意,如果数据库支持自动提交功能,则最初必须关闭。”

报价

三引号字符串是多行的,单引号字符串不是。

插值

因为这实际上不是字符串插值。这些占位符由 MySQLdb 解释,它将为您处理引用。

于 2013-09-28T14:05:09.703 回答