2015-02-10 16 views
6

Używam Python 3.4 z dystrybucji Anaconda. W ramach tej dystrybucji znalazłem bibliotekę pymysql, aby połączyć się z istniejącą bazą danych MySQL, która znajduje się na innym komputerze.Makiety baza danych MySQL w Pythonie

import pymysql 
config = { 
     'user': 'my_user', 
     'passwd': 'my_passwd', 
     'host': 'my_host', 
     'port': my_port 
    } 

    try: 
     cnx = pymysql.connect(**config) 
    except pymysql.err.OperationalError : 
     sys.exit("Invalid Input: Wrong username/database or password") 

Teraz chcę napisać kod testowy dla mojej aplikacji, w której chcesz utworzyć niewielką bazę danych na setUp każdego przypadku testowego, najlepiej w pamięci. Jednak, gdy spróbuję tego spoza niebieskiego z pymysql, nie może nawiązać połączenia.

def setUp(self): 
    config = { 
     'user': 'test_user', 
     'passwd': 'test_passwd', 
     'host': 'localhost' 
    } 
    cnx = pymysql.connect(**config) 

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 61] Connection refused)") 

I zostały googling wokół, i znaleźć kilka rzeczy o SQLite i MySQLdb. Mam następujące pytania:

  1. Is sqlite3 lub MySQLdb nadaje się do tworzenia szybko bazy danych w pamięci?
  2. Jak zainstalować MySQLdb w pakiecie Anaconda?
  3. Czy istnieje przykład testowej bazy danych utworzonej w setUp? Czy to nawet dobry pomysł?

Nie mam serwera MySQL działającego lokalnie na moim komputerze.

+2

odpowiedź może okazać się dostać * * db mysql działa lokalnie. SQLite ma wiele różnic w stosunku do mysql, więc nie byłoby dobrym testem na zastąpienie mysql przez SQLite. –

Odpowiedz

4

Zarówno pymysql, MySQLdb, jak i sqlite będą chciały połączyć się z prawdziwą bazą danych. Jeśli chcesz tylko przetestować kod, powinieneś po prostu sfałszować moduł pymysql na module, który chcesz przetestować, i użyć go odpowiednio (w kodzie testowym: możesz ustawić próbny obiekt, aby zwracał zakodowane wyniki do predefiniowanych instrukcji SQL)

Sprawdź dokumentację o natywnej biblioteki w Pythonie szydząc: https://docs.python.org/3/library/unittest.mock.html

Albo, dla Pythona 2: https://pypi.python.org/pypi/mock

+2

Wygląda na to, że nie jest to możliwe, co chcę. Celem nie jest udawanie pymysql, ponieważ chcę przetestować, czy kod działa na "prawdziwej" bazie danych SQL. Nie ma znaczenia, czy ma on wszystkie osobliwości MySQL, ale powinien być w stanie komunikować się za pośrednictwem pymysql. Lokalne instalowanie serwera MySQL na każdym komputerze, na którym przeprowadzam testy, jest niepraktyczne. – physicalattraction

+2

SQLite * to * "prawdziwa" baza danych, w przeciwieństwie do pymysql i MySQLdb, które są po prostu łącznikami do MySQL. – Air

+0

Należy również zauważyć, że w żaden sposób nie trzeba mieć MySQL w "wszystkich komputerach, na których trzeba uruchamiać testy" - wszystkie z nich mogą łączyć się z jedną i tą samą bazą danych MySQL na jednym komputerze, podając adres URL połączenia – jsbueno