Подключение к серверу Microsoft SQL с использованием Python

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

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] [Диспетчер драйверов] Имя источника данных не найдено, и указанный драйвер по умолчанию не указан (0) (SQLDriverConnect) ")

Pyodbc - "Имя источника данных не найдено, а драйвер по умолчанию не указан"

Спасибо

Ответы

Ответ 1

Вот как я это делаю...

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,))

Соответствующие ресурсы:

Ответ 2

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

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)

Ответ 3

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

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

Ниже приведены оба подхода к вашим параметрам соединения. Кроме того, я 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()

Ответ 4

Предпочитаю так... было намного проще

http://www.pymssql.org/en/stable/pymssql_examples.html

conn = pymssql.connect("192.168.10.198", "odoo", "secret", "EFACTURA")
cursor = conn.cursor()
cursor.execute('SELECT * FROM usuario')

Ответ 5

Вот несколько фотографий для новичков.

enter image description here

Ответ 6

Попробуйте использовать pytds, он работает в более сложной среде, чем pyodbc и проще в настройке.

Я сделал это работает на Ubuntu 18.04

Ссылка: https://github.com/denisenkom/pytds

Пример кода в документации:

import pytds
with pytds.connect('server', 'database', 'user', 'password') as conn:
    with conn.cursor() as cur:
        cur.execute("select 1")
        cur.fetchall()

Ответ 7

Следующий код Python работал для меня. Чтобы проверить соединение ODBC, я сначала создал 4-строчное консольное приложение С#, как указано ниже.

Код Python

import pandas as pd
import pyodbc 
cnxn = pyodbc.connect("Driver={SQL Server};Server=serverName;UID=UserName;PWD=Password;Database=RCO_DW;")
df = pd.read_sql_query('select TOP 10 * from dbo.Table WHERE Patient_Key > 1000', cnxn)
df.head()

Вызов хранимой процедуры

 dfProcResult = pd.read_sql_query('exec dbo.usp_GetPatientProfile ?', cnxn, params=['MyParam'] )

Программа на С# для проверки соединения ODBC

    static void Main(string[] args)
    {
        string connectionString = "Driver={SQL Server};Server=serverName;UID=UserName;PWD=Password;Database=RCO_DW;";
        OdbcConnection cn = new OdbcConnection(connectionString);
        cn.Open();
        cn.Close();
    }

Ответ 8

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

С уважением.

Ответ 9

Если бы вы могли обновить свой sql-сервер, вы можете запустить свой код python на sql-сервере напрямую, используя Python in-databse.

Вы можете прочитать больше о том, как запустить python или r в базе данных в этой статье.