2013-04-01 11 views
8

Próbuję połączyć się z bazą danych SQL Server 2012 przy użyciu SQLAlchemy (z pyodbc) w Pythonie 3.3 (Windows 7-64-bit). Mogę się połączyć za pomocą prostego pyodbc, ale nie udało się połączyć za pomocą SQLAlchemy. Mam konfigurację plików DSN dla dostępu do bazy danych.Łączenie z programem SQL Server 2012 przy użyciu sqlalchemy i pyodbc

pomyślnie połączyć się przy użyciu prostej pyodbc tak:

con = pyodbc.connect('FILEDSN=c:\\users\\me\\mydbserver.dsn') 

Dla SQLAlchemy Próbowałem:

import sqlalchemy as sa 
engine = sa.create_engine('mssql+pyodbc://c/users/me/mydbserver.dsn/mydbname') 

Sposób create_engine faktycznie nie skonfigurowania połączenia i uda, ale IIF Próbuję coś, co powoduje, że sqlalchemy faktycznie konfiguruje połączenie (np. engine.table_names()), trwa to chwilę, ale następnie zwraca ten błąd:

DBAPIError: (Error) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect)') None None

Nie jestem pewien, co się dzieje źle, jak zobaczyć, jaki łańcuch połączenia jest rzeczywiście przekazywane do pyodbc przez sqlalchemy. Z powodzeniem używam tych samych klas sqlalchemy z SQLite i MySQL.

Z góry dziękuję!

Odpowiedz

21

Łańcuch DSN oparty na plikach jest interpretowany przez SQLAlchemy jako nazwa serwera = c, nazwa bazy danych = users.

Preferuję łączenie bez użycia DSN, jest to jedno zadanie konfiguracyjne mniej podczas migracji kodu.

Ta składnia działa przy użyciu uwierzytelniania systemu Windows:

engine = sa.create_engine('mssql+pyodbc://server/database') 

Albo z SQL Authentication:

engine = sa.create_engine('mssql+pyodbc://user:[email protected]/database') 

SQLAlchemy posiada gruntowne wyjaśnienie różnych opcji ciąg połączenia here.

+2

Dzięki. Instancja SQL Server jest jedyną, której nie ma na komputerze, nad którym pracuję, więc nie byłem pewien, czy dzieje się tu coś śmiesznego. Wystarczy trochę rozszerzyć żądane przez ciebie żądań (ponieważ instancje serwera sql są najwyraźniej nazwane) - 'sa.create_engine ('mssql + pyodbc: // [nazwa maszyny] \\ [nazwa serwera]/[baza danych]')' –

+1

Oni nie Trzeba je nazwać. Łatwiej jest się z nim połączyć i używać instancji serwera sql skonfigurowanej jako "instancja domyślna". Wymienione instancje są wymagane, gdy będziesz hostować wiele instancji serwera sql na jednym serwerze. – marr75

6

Mam aktualizację informacji o połączeniu z serwerem MSSQL bez korzystania z DSN i używania uwierzytelniania systemu Windows. W moim przykładzie mam następujące opcje: Mój lokalny serwer to "(localdb) \ ProjectsV12". Nazwa lokalnego serwera widzę z właściwości bazy danych (używam Windows 10/Visual Studio 2015). Nazywam db jest "MainTest1"

engine = create_engine('mssql+pyodbc://(localdb)\ProjectsV12/MainTest1?driver=SQL+Server+Native+Client+11.0', echo=True) 

To jest potrzebne, aby określić sterownik w związku. można znaleźć wersję kliencką w:

control panel>Systems and Security>Administrative Tools.>ODBC Data Sources>System DSN tab>Add

patrzeć na wersji SQL Native Client z listy.

+0

To jest jedyny, który pracował dla mnie. Wielkie dzięki! – Barka

Powiązane problemy