Łączenie się z serwerem Microsoft SQL za pomocą Pythona


97

Próbuję połączyć się z SQL przez Pythona, aby uruchomić niektóre zapytania w niektórych bazach danych SQL na serwerze Microsoft SQL. Z moich badań w Internecie i na tym forum wynika, że ​​najbardziej obiecującą biblioteką jest piodbc. Więc stworzyłem następujący kod

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

i otrzymaj następujący błąd

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

Przejrzałem następujące posty i próbowałem zmienić mój sterownik na {sql server} i łączyłem się wcześniej za pomocą linków ODBC w SAS, na czym częściowo opiera się mój powyższy kod, więc nie myśl, że muszę instalować cokolwiek innego.

pyodbc.Error: ('IM002', '[IM002] [unixODBC] [Driver Manager] Nie znaleziono nazwy źródła danych i nie określono domyślnego sterownika (0) (SQLDriverConnect)')

Pyodbc - „Nie znaleziono nazwy źródła danych i nie określono domyślnego sterownika”

Dzięki

Odpowiedzi:


144

Tak to robię ...

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

Odpowiednie zasoby:


62

Niewielki dodatek do tego, co zostało powiedziane wcześniej. Prawdopodobnie chcesz zwrócić ramkę danych. Byłoby to zrobione jako

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

W połączeniach źródła danych między klientem a serwerem istnieją dwa ogólne typy: ODBC, który używa STEROWNIKA i OLEDB, który korzysta z DOSTAWCY. W świecie programowania toczy się regularna debata na temat tego, jaką drogę należy obrać w łączeniu się ze źródłami danych.

Używasz dostawcy SQLOLEDB, ale określasz go jako sterownik. O ile wiem, ani moduły pyodbc, ani pypyodbc nie obsługują połączeń Window OLEDB. Jednak adodbapi korzysta z ADO firmy Microsoft jako podstawowego składnika.

Poniżej znajdują się oba podejścia do parametrów połączenia. Ponadto formatuję zmienne łańcuchowe, ponieważ Twoja konkatenacja nie dzieli poprawnie cudzysłowów w ciągu. Zauważysz, że podwoiłem nawiasy klamrowe, ponieważ jest to potrzebne w ciągu połączenia, a string.format()także go używa.

# 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()

Dzięki za wyjaśnienie i kod mam sterownik do pracy. Chociaż musiałem się pozbyć .formatu (...) i umieścić zmienne w odpowiednich miejscach. Co miał zrobić format?
Christopher Ell

1
Musisz zainstalować, adodbapiaby korzystać z połączenia OLEDB. Format łańcucha jest zalecanym sposobem przekazywania zmiennych do łańcucha zamiast używania +operatora. Nawiasy klamrowe z liczbami to symbole zastępcze, które odpowiednio się format()wypełniają. Możesz nawet przekazywać listy i krotki za pomocą format(). Twój oryginalny kod nie dzielił ciągu znaków i zmiennych za pomocą cudzysłowów, więc +został uznany za część ciągu.
Parfait

4
Chociaż ta odpowiedź jest świetna i pomogła mi rozwiązać problem. ktokolwiek próbuje to zrobić, pamiętaj, że możesz otrzymać wyjątek, jeśli ustawisz zaufane połączenie = yes i wpiszesz UID / pwd w tych samych parametrach połączenia. Jest to kombinacja albo / lub, a kiedy używasz zaufanego połączenia, twoje poświadczenia systemu NT / systemu są używane do uwierzytelniania, nawet jeśli wyraźnie podasz UID / PWD.
S4nd33p



4

Spróbuj użyć pytds, działa w bardziej złożonym środowisku pyodbci łatwiejszym w konfiguracji.

Zrobiłem to na Ubuntu 18.04

Ref: https://github.com/denisenkom/pytds

Przykładowy kod w dokumentacji:

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

1
Dziękuję Ci. Działa jak urok bez skomplikowanej konfiguracji.
Shubham Patel

3

Poniższy kod Pythona zadziałał dla mnie. Aby sprawdzić połączenie ODBC, najpierw utworzyłem 4-wierszową aplikację konsoli C #, jak pokazano poniżej.

Kod Pythona

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

Wywołanie procedury składowanej

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

Program C # do sprawdzania połączenia 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

Alternatywnym podejściem byłoby zainstalowanie sterownika Microsoft ODBC Driver 13, a następnie zastąpienie SQLOLEDBgoODBC Driver 13 for SQL Server

Pozdrowienia.


0

oto ten, który działa dla mnie:

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

Znalazłem aktualne zasoby tutaj: Microsoft | Dokumenty SQL | Sterownik języka Python SQL

Wyjaśniono te dwie opcje, w tym wszystkie wymagane wymagania wstępne i przykłady kodu: Sterownik Python SQL - pyodbc (przetestowany i działający) Sterownik Python SQL - pymssql


Cześć - witamy w Stack Overflow - powinieneś postarać się odpowiedzieć na pytanie za pomocą kilku pomysłów (w tym przypadku nowych pomysłów) - Twojego własnego kodu lub nowego podejścia. Następnie użyj kilku linków, aby zapewnić dodatkową pomoc lub utworzyć kopię zapasową rozwiązania. Nie powinieneś po prostu publikować linków.
Alex Leo

0

Moja wersja. Mam nadzieję, że to pomoże.


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

Próbowałem połączyć się z serwerem sql w następujący sposób i te zadziałały.

Aby połączyć się przy użyciu uwierzytelniania systemu 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")

Aby skorzystać z uwierzytelniania serwera sql, użyłem następującego kodu.

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

Spróbuj z 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)

Wynik:

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)

Połączenie można również sprawdzić z terminala za pomocą pojedynczej linii kodu z sqlcmd. Zobacz składnię .

╔═════════╦═════════════════════════════════════════╗
║ 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"

wynik:

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.)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.