2012-07-31 14 views
6

Uzyskuję dostęp do bazy danych MySQL z Pythona za pośrednictwem biblioteki MySQLdb. Próbuję przetestować połączenie z bazą danych, jak pokazano poniżej.Jak przetestować połączenie z bazą danych w pythonie?

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 

Czy to właściwa droga, należy testować łączność podczas pisania testcases jednostek? Jeśli jest lepszy sposób, proszę oświeć!

+0

poprawiono błąd w kodzie. Chcesz wiedzieć, czy jest to odpowiedni sposób na sprawdzenie? – Nemo

+0

* Dlaczego * chcesz * testować * łączność? Co robisz, jeśli test się nie powiedzie? –

+0

Piszę jednostki testowe dla metod dostępu do db. Więc chcesz wyeliminować przypadek, gdy dostęp do bazy danych nie powiedzie się. – Nemo

Odpowiedz

1

Tak. Dla mnie wygląda dobrze.

Moje osobiste preferencje:

  • rzeczywiście wyjątek, jeśli nie ma połączenia
  • trzeba tylko fetchone test dla Żaden jest zbędne (chyba, że ​​jesteś zapalonym wymusić minimalną wersję bazy danych)
+0

Nie rozumiem, dlaczego jest to zbyteczne. Czy mógłbyś rozwinąć lub wskazać, jak byś to zakodował? – Nemo

+0

"wyniki" nie będą występować, gdy nie ma połączenia. Prawdopodobnie uzyskasz inny wyjątek próbujący wykonać "wyniki [0]", gdy ich Brak. Spróbuj! –

8

Mogę się mylić (lub źle interpretować twoje pytanie :)), ale wierzę, że wyjątek związany z połączeniem zostanie zgłoszony na MySQLdb.connect(). W przypadku MySQLdb wyjątek do złapania to MySQLdb.Error. Dlatego sugerowałbym przeniesienie konfiguracji db wewnątrz bloku try i wyłapanie właściwego wyjątku (MySQLdb.Error). Ponadto, jak wspomina @JohnMee, fetchone() zwróci None, jeśli nie ma wyników, więc to powinno działać:

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 

Jeśli nie dbają o połączeniu i są po prostu patrząc przetestować wykonanie zapytania, chyba można zostawić konfiguracji połączenia poza try ale to MySQLdb.Error w swojej wyjątkiem, być może, co następuje:

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 

to przynajmniej daje bardziej szczegółowe powody, dlaczego nie udało się.

Powiązane problemy