Python:MySQL查询失败

1 投票
1 回答
2176 浏览
提问于 2025-04-18 06:15

总的来说,我对MySQL比较熟悉,但对Python不太了解。
我正在尝试生成一个.py脚本,用于将一个带有哈希密码的用户插入到半径服务器的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脚本的帮助!

1 个回答

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: 捕获语句会捕获 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)

撰写回答