2015-09-03 15 views
5

Próbuję połączyć się z serwerem SQL Azure przy użyciu pymssql Pythona. Problem polega na tym, że poniższy skrypt działa, ale tylko czasami, inne czasy otrzymuję ten błąd:pymssql: Połączenie z bazą danych działa tylko czasami

_mssql.MSSQLDatabaseException: (20002, b'DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed\n')

Jest to skrypt używam:

import pymssql 
conn = pymssql.connect(server='x', user='x', password='x', database='x') 
cursor = conn.cursor() 
cursor.execute('SELECT * FROM customers'); 
row = cursor.fetchone() 
while row: 
    print (str(row[0]) + " " + str(row[1]) + " " + str(row[2])) 
    row = cursor.fetchone() 

Byłoby mi bardzo pomocne, jeśli ktoś może mi powiedzieć, dlaczego powyższy skrypt działa tylko czasami, a reszta razy pojawia się błąd "Połączenie serwera Adaptive Server nie powiodło się".

Odpowiedz

5

Przejrzałem te stare wątki: Read from the server failed when trying to connect to sql-azure from tsql i What is TDS Protocol Version 8.0 and why should I use it?. Problem wydaje się być spowodowany użyciem niewłaściwej wersji FreeTDS.

Znalazłem klucz na stronie oficjalnej strony FreeTDS http://www.freetds.org/faq.html#Does.FreeTDS.support.Microsoft.servers.

Istnieje tabela wersji protokołu TDS według produktu http://www.freetds.org/userguide/choosingtdsprotocol.htm.

enter image description here

FreeTDS będzie alias tej wersji 7.1 ze względu na kompatybilność wstecz, ale należy unikać ze względu na przyszłe problemy ze zgodnością. Zobacz notatkę poniżej o przestarzałych wersjach.

Jeśli używasz pymssql z FreeTDS na Linuksie, myślę, że musisz sprawdzić plik konfiguracyjny "freetds.conf" na ścieżce/etc/freetds /.

To jest moja konfiguracja serwera SQL Azure poniżej:

# A typical Microsoft server 
[egServer70] 
     host = <database_name>.database.windows.net 
     port = 1433 
     tds version = 7.3 

Można spróbować przetestować połączenie do serwera SQL Azure przy użyciu narzędzia FreeTDS 'tsql' do polecenia 'tsql -H <database_name>.database.windows.net -U Username -D DatabaseName -p 1433 -P Password'.

Pozdrawiam.

+0

Dzięki za tę odpowiedź, naprawdę pomocne rzeczy. Kolejną rzeczą, która mi pomogła, było skorzystanie z puli połączeń: http://docs.sqlalchemy.org/en/latest/core/pooling.html – dmn

+0

Każdy pomysł, dlaczego to się nie udaje "tylko czasami"? Też doświadczyłem tego przy użyciu adaptera opartego na FreeTDS w PHP, gdzie może się nie udać 1/50 prób połączenia z tym błędem. Wydaje się to dziwne, spodziewałem się, że to albo zadziała, albo nie, a nie dziwaczna okazjonalna porażka. Wydaje się, że to rozwiązanie naprawiło problem, dlatego bardzo dziękuję za informacje :-) – DaveRandom

Powiązane problemy