2013-09-28 53 views
1

我知道SO不是“调试我的代码服务”,但经过几个小时的检查和重试后,我错过了一些非常愚蠢的东西,或者有一个错误(或编译错误)在我MySQLdb的模块...Python,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是一个长整数,我检查过。那么,怎么了?

谢谢

回答

2

的改变不会生效:

你在做交易?如果是这样,你需要提交。

引用

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

插值

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

+0

不明确(我没有写代码来启动一个事务,只是打开了连接并执行了两个查询)。但是在最后添加** connection.commit()**解决了这个问题。谢谢。 – Paolo