2014-05-12 26 views
1

一般来说,我熟悉MySQL,但不熟悉Python。 我尝试生成.py脚本,它将具有散列密码的用户插入到radius服务器的mysql数据库中。Python:MySQL-Query失败

这就是我的剧本至今:

#!/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命令行的查询工作正常。

脚本中的错误在哪里? 我认为这可能是一个太长的散列,但散列长度只有100个字符,只有<。 (但包含特殊字符,如美元$)。 此外,我会很感激帮助如何在一般情况下调试python-sql-scripts!

+0

我选择了从数据库中的所有记录,实际上,这些记录都存储。但为什么我会得到一个异常? – Drudge

+0

要获取更多信息,请将'except'更改为',但将例外设置为e:'。然后将'print'FEHLER查询失败''更改为'print e' – huu

+0

有趣的是,我最后一条评论将解决您的问题,但没有透露幕后发生的情况,并导致您痛苦。查看我的答案了解更多详情。 – huu

回答

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) 
+0

哦,谢谢!我不知道sys.exit()引发了一个例外。我认为脚本只是终止并返回0到调用python脚本的进程。 我还没试过,但是如果我把“Exception as e:”区块,为什么没有在那里捕捉到引发的SystemExit异常? – Drudge

+0

因为'SystemExit'不是从'Exception'派生的。 'Exception'通常是用户和模块编写者用自己的代码扩展的基类。有关更多信息,请参阅[例外]的官方文档(https://docs.python.org/2/library/exceptions.html#exceptions.Exception)和[SystemExit](https://docs.python.org/ 2/library/exceptions.html#exceptions.SystemExit) – huu

+0

这就是interestion,那么我理解后面的逻辑。我认为Python中的每个异常都来自'exception'。很高兴知道。 我使用了你提供的最后一个解决方案,它对我来说工作得很好。谢谢! :) – Drudge