2015-11-15 5 views
20

Я пытаюсь подключиться к SQL через python для запуска некоторых запросов в некоторых SQL-базах данных на сервере Microsoft SQL. Из моих исследований в Интернете и на этом форуме наиболее перспективной библиотекой, по-видимому, является pyobbc. Таким образом, я сделал следующий кодПодключение к серверу Microsoft SQL с использованием Python

import pyodbc 
conn = pyodbc.connect(init_string="driver={SQLOLEDB}; server=+ServerName+; 
database=+MSQLDatabase+; trusted_connection=true") 
cursor = conn.cursor() 

и получить следующее сообщение об ошибке

Traceback (most recent call last): 
    File "C:\Users...\scrap.py", line 3, in <module> 
    conn = pyodbc.connect(init_string="driver={SQLOLEDB}; server=+ServerName+; database=+MSQLDatabase+; trusted_connection=true") 
pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)') 

Я смотрел на на следующие должности и попытался изменить свой драйвер {SQL SERVER} и подсоединенного с помощью ODBC ссылки, прежде чем в SAS, что частично связано с моим вышеописанным кодом, поэтому не думайте, что мне нужно установить что-нибудь еще.

pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)')

Pyodbc - "Data source name not found, and no default driver specified"

Благодаря

ответ

34

Это, как я это делаю ...

import pyodbc 
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};" 
         "Server=server_name;" 
         "Database=db_name;" 
         "Trusted_Connection=yes;") 


cursor = cnxn.cursor() 
cursor.execute('SELECT * FROM Table') 

for row in cursor: 
    print('row = %r' % (row,)) 

Соответствующие источники:

14

В исходных данных соединений между клиентом и сервером существует два основных типа: ODBC, который использует драйвер и OLEDB, который использует Provider. И в мире программирования это regular debate относительно того, какой маршрут можно подключить к источникам данных.

Вы используете поставщика, SQLOLEDB, но укажите это как драйвер. Насколько я знаю, ни модули pyobbc, ни pypyodbc не поддерживают соединения Window OLEDB. Однако, adodbapi делает, который использует Microsoft ADO в качестве базового компонента.

Ниже приведены оба подхода к вашим параметрам соединения. Кроме того, I string format ваши переменные, так как ваша конкатенация неправильно сломала кавычки в строке. Вы заметите, что я удваиваю фигурные скобки, так как это необходимо в строке соединения, и string.format() также использует его.

# PROVIDER 
import adodbapi 
conn = adodbapi.connect("PROVIDER=SQLOLEDB;Data Source={0};Database={1}; \ 
     trusted_connection=yes;UID={2};PWD={3};".format(ServerName,MSQLDatabase,username,password)) 
cursor = conn.cursor() 

# DRIVER 
import pyodbc 
conn = pyodbc.connect("DRIVER={{SQL Server}};SERVER={0}; database={1}; \ 
     trusted_connection=yes;UID={2};PWD={3}".format(ServerName,MSQLDatabase,username,password)) 
cursor = conn.cursor() 
+0

Спасибо за пояснения и код, который я получил водитель один работать. Хотя мне пришлось избавиться от .format (...) и поместите переменные в нужные места. Каким должен был быть формат? –

+0

Вам необходимо установить 'adodbapi' для использования соединения OLEDB. И формат строки - это рекомендуемый способ передачи переменных в строку, а не с помощью оператора '+'. Кудрявые фигурные скобки с числами являются заполнителями, которые 'format()' заполняются соответствующим образом. Вы даже можете передавать списки и кортежи с помощью 'format()'. Ваш исходный код не разбивал строки и переменные кавычками, поэтому '+' считался частью строки. – Parfait

+1

Хотя этот ответ велик и помог мне решить проблему. тот, кто пытается это сделать, помнит, что вы можете получить исключение, если вы установите доверенное соединение = да и введите UID/pwd в той же строке соединения. Это либо/или комбинация, и когда вы используете надежное соединение, ваши учетные данные NT/System используются для аутентификации, даже если вы явно указываете UID/PWD. – S4nd33p

1

Альтернативный подход будет installing Microsoft ODBC Driver 13, а затем заменить SQLOLEDB с ODBC Driver 13 for SQL Server

С уважением.

8

Незначительное дополнение к тому, что было сказано ранее. Вероятно, вы захотите вернуть данные. Это будет сделано, как

import pypyodbc 
import pandas as pd 

cnxn = pypyodbc.connect("Driver={SQL Server Native Client 11.0};" 
         "Server=server_name;" 
         "Database=db_name;" 
         "uid=User;pwd=password") 
df = pd.read_sql_query('select * from table', cnxn) 
Смежные вопросы