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

はい。は、私にはよく見えますよ。

私の個人的な好み:

  • 接続がない場合、実際に例外をスローします
  • フェッチする必要があるのは 1 つだけです。None のテストは不要です (データベースの最小バージョンを強制する場合を除きます)。
于 2012-07-31T07:55:06.820 に答える