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

97

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

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 - «Имя источника данных не найдено, и драйвер по умолчанию не указан»

Благодарность

Кристофер Элл
источник

Ответы:

144

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

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

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

ЯСЕНЬ
источник
63

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

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)
Кит
источник
38

В соединениях с источниками данных между клиентом и сервером есть два основных типа: ODBC, который использует ДРАЙВЕР, и OLEDB, который использует ПРОВАЙДЕР. А в мире программирования регулярно ведутся дискуссии о том, какой путь использовать для подключения к источникам данных.

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

Ниже приведены оба подхода к параметрам вашего подключения. Кроме того, я форматирую ваши переменные в строковом формате, так как ваша конкатенация неправильно разбивает кавычки в строке. Вы заметите, что я удваиваю фигурные скобки, так как они необходимы в строке подключения и 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()
Парфе
источник
Спасибо за объяснение и код. Я заставил драйвер работать. Хотя мне пришлось избавиться от .format (...) и поместить переменные в нужные места. Что должен был делать формат?
Christopher Ell
1
Вам необходимо установить, adodbapiчтобы использовать соединение OLEDB. Строковый формат - это рекомендуемый способ передачи переменных в строку вместо использования +оператора. Фигурные скобки с числами являются заполнителями, которые format()заполняются соответствующим образом. Вы даже можете передавать списки и кортежи, используя format(). Ваш исходный код не разбивал строку и переменные кавычками, поэтому +считался частью строки.
Parfait
4
Хотя этот ответ отличный и помог мне решить проблему. кто бы ни пытался это сделать, помните, что вы можете получить исключение, если установите доверенное соединение = да и введите UID / pwd в той же строке подключения. Это комбинация «или / или», и когда вы используете доверенное соединение, ваши учетные данные NT / системы используются для аутентификации, даже если вы явно указываете UID / PWD.
S4nd33p
15

Я предпочитаю этот способ ... было намного проще

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')
Франко
источник
3
Pablo EM
1
НО! с августа 2020 года он больше не амортизируется. вы можете видеть, что репо снова активно: github.com/pymssql/pymssql
deweydb
13

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

введите описание изображения здесь

Андрей
источник
4

Попробуйте использовать 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()
Альфред Хуанг
источник
1
Спасибо. Работает как шарм без сложной настройки.
Шубхам Патель,
3

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

Код 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'] )

Программа C # для проверки подключения 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();
    }
LCJ
источник
0

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

С уважением.

Mondieki
источник
0

вот тот, который мне подходит:

from sqlalchemy import create_engine
import urllib

conn_str = (
r'Driver=ODBC Driver 13 for SQL Server;'
r'Server=DefinitelyNotProd;'
r'Database=PlayPen;'
r'Trusted_Connection=Yes;')

quoted_conn_str = urllib.parse.quote_plus(conn_str)
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted_conn_str))
Джеймс
источник
0

Я нашел здесь самые свежие ресурсы: Microsoft | Документы SQL | Драйвер Python SQL

Здесь объясняются эти два варианта, включая все необходимые предварительные условия и примеры кода: Драйвер Python SQL - pyodbc (проверено и работает) Драйвер Python SQL - pymssql

Карл
источник
Привет - добро пожаловать в Stack Overflow - вы должны стремиться ответить на этот вопрос некоторыми идеями (в данном случае - новыми идеями) - частью вашего собственного кода или новым подходом. Затем воспользуйтесь ссылками, чтобы предоставить дополнительную помощь или создать резервную копию вашего решения. Вы не должны просто размещать ссылки.
Алекс Лео
0

Моя версия. Надеюсь, это поможет.


import pandas.io.sql
import pyodbc
import sys

server = 'example'
db = 'NORTHWND'
db2 = 'example'

#Crear la conexión
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + server +
                      ';DATABASE=' + db +
                      ';DATABASE=' + db2 +
                      ';Trusted_Connection=yes')
#Query db
sql = """SELECT [EmployeeID]
      ,[LastName]
      ,[FirstName]
      ,[Title]
      ,[TitleOfCourtesy]
      ,[BirthDate]
      ,[HireDate]
      ,[Address]
      ,[City]
      ,[Region]
      ,[PostalCode]
      ,[Country]
      ,[HomePhone]
      ,[Extension]
      ,[Photo]
      ,[Notes]
      ,[ReportsTo]
      ,[PhotoPath]
  FROM [NORTHWND].[dbo].[Employees] """
data_frame = pd.read_sql(sql, conn)
data_frame

Хосе Гарсия
источник
0

Я попытался подключить sql-сервер следующими способами, и они сработали для меня.

Для подключения с использованием проверки подлинности Windows

import pyodbc

conn = pyodbc.connect('Driver={SQL Server};Server='+servername+';Trusted_Connection=yes;Database='+databasename+';')
cursor = conn.cursor()
cursor.execute("Select 1 as Data")

Чтобы использовать аутентификацию сервера sql, я использовал следующий код.

import pyodbc

conn = pyodbc.connect('Driver={SQL Server};Server='+servername+  ';UID='+userid+';PWD='+password+';Database='+databasename) 
cursor1 = conn.cursor()
cursor1.execute("SELECT 1 AS DATA")
SRK_124
источник
0

Попробуйте pymssql:pip install pymssql

import pymssql

try:
    conn = pymssql.connect(server="host_or_ip", user="your_username", password="your_password", database="your_db")
    cursor = conn.cursor()
    cursor.execute ("SELECT @@VERSION")
    row = cursor.fetchone()
    print(f"\n\nSERVER VERSION:\n\n{row[0]}")
    cursor.close()
    conn.close()
except Exception:
    print("\nERROR: Unable to connect to the server.")
    exit(-1)

Выход:

SERVER VERSION:

Microsoft SQL Server 2016 (SP2-CU14) (KB4564903) - 13.0.5830.85 (X64)
        Jul 31 2020 18:47:07
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

Соединение также можно проверить с терминала с помощью одной строки кода с sqlcmd. См. Синтаксис .

╔═════════╦═════════════════════════════════════════╗
║ Command ║               Description               ║
╠═════════╬═════════════════════════════════════════╣
║   -S    ║ [protocol:]server[instance_name][,port] ║
║   -U    ║ login_id                                ║
║   -p    ║ password                                ║
║   -Q    ║ "cmdline query" (and exit)              ║
╚═════════╩═════════════════════════════════════════╝
sqlcmd -S "host_or_ip"  -U "your_username" -p -Q "SELECT @@VERSION"

выход:

Password:    your_password



--------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2016 (SP2-CU14) (KB4564903) - 13.0.5830.85 (X64) 
        Jul 31 2020 18:47:07 
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)


(1 rows affected)

Network packet size (bytes): 4096
1 xact[s]:
Clock Time (ms.): total         1  avg   1.00 (1000.00 xacts per sec.)
Милован Томашевич
источник