Python:MySQL查询失败

Python:MySQL查询失败,python,mysql,debugging,Python,Mysql,Debugging,一般来说,我熟悉MySQL,但不熟悉Python。 我尝试生成.py脚本,该脚本将带有哈希密码的用户插入radius服务器的mysql数据库 这就是我目前的剧本: #!/usr/bin/python2.7 import sys import MySQLdb from passlib.hash import django_pbkdf2_sha256 as cryptohandler def adduser(username, password_plain): password = c

一般来说,我熟悉MySQL,但不熟悉Python。 我尝试生成.py脚本,该脚本将带有哈希密码的用户插入radius服务器的mysql数据库

这就是我目前的剧本:

#!/usr/bin/python2.7

import sys
import MySQLdb
from passlib.hash import django_pbkdf2_sha256 as cryptohandler


def adduser(username, password_plain):
    password = cryptohandler.encrypt(password_plain)

    conn = MySQLdb.connect(host="localhost", port=3306, user="radius", passwd="radpass", db="radius")
    cursor = conn.cursor()
    if cursor.execute("SELECT op FROM radcheck WHERE username = %s", (username)):
        print 'FEHLER: User existiert bereits und kann daher nicht angelegt werden.'
        sys.exit(1)
    else:
        try:
            cursor.execute("INSERT INTO radcheck(username, attribute, op, value) VALUES(%s, 'Password', ':=', %s)", (username, password))
            conn.commit()
            print 'OK user '+ username +' successfully added with hash'+ password
            sys.exit(0)
        except:
            conn.rollback()
            print 'FEHLER query failed'
            sys.exit(1)

def main():
    adduser(sys.argv[1], sys.argv[2])


main()
输出总是“FEHLER query failed”,第一个查询查找用户名是否存在可以正常工作

radcheck表:

id int(11) unsigned Null=No Key=Pri Default=Null Extra=auto_increment
username varchar(64) Null=No Key=Mul
attribute varchar(64) Null=No
op char(2) Null=No Default="=="
value varchar(253) Null=No
在mysql命令行中执行查询工作正常

我的脚本中的错误在哪里? 我认为这可能是一个太长的散列,但散列只有<100个字符长。(但包含特殊字符,如美元$)。
此外,我希望您能帮助我调试python sql脚本

这里的问题不是您的MySQL代码,而是这个try/except块:

try:
    cursor.execute("INSERT INTO radcheck(username, attribute, op, value) VALUES(%s, 'Password', ':=', %s)", (username, password))
    conn.commit()
    print 'OK user '+ username +' successfully added with hash'+ password
    sys.exit(0)
except:
    conn.rollback()
    print 'FEHLER query failed'
    sys.exit(1)
调用
sys.exit(0)
时,会引发一个名为
SystemExit
的异常。由于除了:catch语句之外的裸
语句捕获
SystemExit
,因此当您调用
sys.exit(0)
时,将始终执行此块。要防止这种情况发生,请将您的
except:
catch更改为:

except Exception as e:
    conn.rollback()
    print 'FEHLER query failed'
    sys.exit(1)
如果您只捕获MySQL错误,则更好:

except MySQLdb.Error as e:
    conn.rollback()
    print 'FEHLER query failed'
    sys.exit(1)

我从数据库中选择了所有记录,实际上,这些记录是存储的。但是为什么会出现异常?要获取更多信息,请将您的
exception
更改为
exception作为e:
。然后将
print'FEHLER query failed'
更改为
print e
,有趣的是,我的最后一条评论将解决您的问题,但对揭示幕后发生的事情和给您带来的痛苦几乎没有帮助。更多细节请参见我的答案。哦,谢谢!我不知道sys.exit()会引发一个exeption。我认为脚本只是终止,并将0返回给调用python脚本的进程。我还没有尝试过,但是如果我将“Exception Exception as e:”块取为,为什么在那里没有捕获到引发的SystemExit异常?因为
SystemExit
不是从
Exception
派生的<代码>异常
通常是用户和模块编写器使用自己的代码扩展的基类。有关更多信息,请参阅官方文档,这是有趣的,那么我确实理解背后的逻辑。我认为Python中的每个异常都源自
异常
。很高兴知道这一点。我使用了您提供的上一个解决方案,它对我很好。谢谢!:)