Підключення до сервера 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 - "Ім'я джерела даних не знайдено, а драйвер за замовчуванням не вказано"

Дякую

Відповіді:


145

Ось як я це роблю ...

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

Відповідні ресурси:


61

Незначне доповнення до сказаного раніше. Ви, ймовірно, хочете повернути фрейм даних. Це було б зроблено як

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 (...) та розмістити змінні у відповідних місцях. Для чого був призначений формат?
Крістофер Елл,

1
Вам потрібно встановити, adodbapiщоб використовувати підключення OLEDB. Формат рядка - це рекомендований спосіб передачі змінних у рядок, а не використання +оператора. Фігурні дужки з цифрами - це заповнювачі, які format()заповнюють відповідним чином. Ви навіть можете передати списки та кортежі за допомогою format(). Вихідний код не розбивав рядки та змінні за лапками, тому +вважався частиною рядка.
Парфе

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
Цей проект припинено: github.com/pymssql/pymssql
Pablo EM

АЛЕ! станом на серпень 2020 року він більше не амортизується. ви можете бачити, що репо знову активне: github.com/pymssql/pymssql
deweydb


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();
    }

0

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

З повагою.


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 | Драйвер SQL Python

Пояснено ці два варіанти, включаючи всі необхідні передумови та приклади коду: Драйвер Python SQL - pyodbc (перевірено та працює) Драйвер SQL Python - 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")

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.)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.