【问题标题】:Python not able to modify MySQL but user canPython 无法修改 MySQL 但用户可以
【发布时间】:2015-12-14 22:59:32
【问题描述】:

对不起,如果这个问题很愚蠢,我已经学习了 2 天 python

我一直在拼命试图理解为什么我的python 脚本可以运行SELECT 语句,但不能运行UPDATEDELETE 语句。

我认为这将是 MySQL 问题而不是 Python 问题,但我无法再进行故障排除

pcheck.py

import re
import time
import json
import MySQLdb
import requests
from array import *

conn = MySQLdb.connect([redacted])
cur = conn.cursor()

sql1 = "SELECT pkey,pmeta FROM table1 WHERE proced = 0 LIMIT 1"
cur.execute(sql1)
row = cur.fetchone()
while row is not None:
    print "row is: ",row[0]
    rchk = [
     r"(SHA256|MD5)",
     r"(abc|def)"
     ]
    for trigger in rchk:
        regexp = re.compile(trigger)
        pval = row[1]
        if regexp.search(pval) is not None:
            print "matched on: ",row[0]
            sql2 = """INSERT INTO table2 (drule,dval,dmeta) VALUES('%s', '%s', '%s')"""
            try:
                args2 = (trigger, pval, row[1])
                cur.execute(sql2, args2)
                print(cur._last_executed)
            except UnicodeError:
                print "pass-uni"
            break
    else:
        pass

    sql3 = """UPDATE table1 SET proced=1 WHERE pkey=%s"""
    args3 = row[0]
    cur.execute(sql3, args3)
    print(cur._last_executed)
    row = cur.fetchone()

sql3 = """DELETE FROM table1 WHERE proced=1 AND last_update < (NOW() - INTERVAL 6 MINUTE)"""
cur.execute(sql3)
print(cur._last_executed)
cur.close()
conn.close()
print "Finished"

以及实际(和令人惊讶的预期)输出:

输出

scrape@:~/python$ python pcheck.py 
row is:  0GqQ0d6B
UPDATE table1 SET proced=1 WHERE pkey='0GqQ0d6B'
DELETE FROM table1 WHERE proced=1 AND last_update < (NOW() - INTERVAL 6 MINUTE)
Finished

但是,数据库没有被更新。我检查了查询是否正在进入 MySQL:

MySQL 日志

"2015-12-14 22:53:56","localhost []","110","0","Query","SELECT `pkey`,`pmeta` FROM `table1` WHERE `proced`=0 LIMIT 200"
"2015-12-14 22:53:57","localhost []","110","0","Query","UPDATE `table1` SET `proced`=1 WHERE `pkey`='0GqQ0d6B'"
"2015-12-14 22:53:57","localhost []","110","0","Query","DELETE FROM table1 WHERE proced=1 AND last_update < (NOW() - INTERVAL 6 MINUTE)"

但是proced 行 0GqQ0d6B 的值仍然不是 1

如果我通过 Sqlyog(以用户身份登录)进行相同的查询,查询将按预期工作。

【问题讨论】:

  • 修改后提交光标。
  • 将您的 SQL 查询设为 Unicode 字符串以减少 UnicodeExceptions:u"""INSERT INTO table2 (drule,dval,dmeta) VALUES('%s', '%s', '%s')"""
  • @BobDylan 工作得如此完美。修改后我总是commitcursor吗?
  • @HydraIO 是的,你应该,或者配置自动提交(许多 ORM 这样做)
  • @AlastairMcCormack 我也使用了Unicode 技巧,并且肯定看到了这些异常的改进!

标签: python mysql python-2.7


【解决方案1】:

这类问题可能非常令人沮丧。你确定这里没有多余的空格?

print "row is:*"+row[0]+"*"

也许注释掉

for trigger in rchk:

部分,并在周围散布一些打印语句?

【讨论】:

  • 感谢您给我另一个可能的测试用例!
【解决方案2】:

作为评论者,Bob Dylan 能够推断出更改后需要提交的光标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2014-01-04
    相关资源
    最近更新 更多