15

我正在通过 MySQLdb 库从 python 访问 MySQL 数据库。我正在尝试测试数据库连接,如下所示。

db = MySQLdb.connect(self.server, self.user, 
                     self.passwd, self.schema)
cursor = db.cursor()        
try:
    cursor.execute("SELECT VERSION()")
    results = cursor.fetchone()
    ver = results[0]
    if (ver is None):
        return False
    else:
        return True               
except:
    print "ERROR IN CONNECTION"
    return False

这是在编写单元测试用例时测试连接性的正确方法吗?如果有更好的方法,请赐教!

4

2 回答 2

9

我可能是错的(或误解了你的问题:)),但我相信会抛出与连接相关的异常MySQLdb.connect()。对于 MySQLdb,要捕获的异常是MySQLdb.Error. 因此,我建议将db设置移动到try块内并捕获正确的异常(MySQLdb.Error)。此外,正如@JohnMee 提到的,如果没有结果,fetchone()将返回,所以这应该有效:None

try:
    db = MySQLdb.connect(self.server, self.user, self.passwd, self.schema)
    cursor = db.cursor()        
    cursor.execute("SELECT VERSION()")
    results = cursor.fetchone()
    # Check if anything at all is returned
    if results:
        return True
    else:
        return False               
except MySQLdb.Error:
    print "ERROR IN CONNECTION"
    return False

如果您不关心连接并且只是想测试查询的执行,我想您可以将连接设置留在外部try但包含MySQLdb.Error在您的异常中,可能如下所示:

db = MySQLdb.connect(self.server, self.user, self.passwd, self.schema)
cursor = db.cursor() 

try:
    cursor.execute("SELECT VERSION()")
    results = cursor.fetchone()
    # Check if anything at all is returned
    if results:
        return True
    else:
        return False               
except MySQLdb.Error, e:
    print "ERROR %d IN CONNECTION: %s" % (e.args[0], e.args[1])
return False

这至少会给你一个更详细的失败原因。

于 2012-08-10T05:43:28.380 回答
2

Yes. Looks good to me.

My personal preferences:

  • actually throw an exception if no connection
  • you only need to fetchone, the test for None is superfluous (unless you're keen to enforce a minimum version of the database)
于 2012-07-31T07:55:06.820 回答