Python:MySQL-Query失败

时间:2014-05-12 00:38:31

标签: python mysql debugging

一般来说,我熟悉MySQL而不熟悉Python。 我尝试生成.py脚本,该脚本将带有散列密码的用户插入到radius-server的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查询失败",第一个查询用户名是否存在的查询工作正常。

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-command-line中执行查询工作正常。

我的脚本中的错误在哪里? 我认为这可能是一个太长的哈希,但哈希只是< 100个字符长。 (但包含特殊字符,如美元$)。 另外,我非常感谢帮助如何调试python-sql-scripts!

1 个答案:

答案 0 :(得分:1)

这里的问题不是你的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的异常。由于裸except: catch语句捕获SystemExit,因此当您调用sys.exit(0)时,将始终执行此块。要防止这种情况发生,请将except:捕获更改为:

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)