Python kullanarak Microsoft SQL sunucusuna bağlanma


98

Microsoft SQL sunucusundaki bazı SQL veritabanlarında bazı sorgular çalıştırmak için python aracılığıyla SQL'e bağlanmaya çalışıyorum. Çevrimiçi araştırmamdan ve bu forumdaki en umut verici kütüphane pyodbc gibi görünüyor. Bu yüzden aşağıdaki kodu yaptım

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

ve aşağıdaki hatayı al

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

Aşağıdaki gönderilere baktım ve sürücümü {sql server} olarak değiştirmeyi denedim ve daha önce SAS'da ODBC bağlantılarını kullanarak bağlanmıştım, bu kısmen yukarıdaki koduma dayanıyor, bu yüzden başka bir şey yüklemem gerektiğini düşünmeyin.

pyodbc.Error: ('IM002', '[IM002] [unixODBC] [Sürücü Yöneticisi] Veri kaynağı adı bulunamadı ve varsayılan sürücü belirtilmedi (0) (SQLDriverConnect)')

Pyodbc - "Veri kaynağı adı bulunamadı ve varsayılan sürücü belirtilmedi"

Teşekkürler


İşte yeni başlayanlar için bazı resimler. ! [resim açıklamasını buraya girin ] ( i.stack.imgur.com/wLXWQ.png )
Andrew

SQL Server ile hangi python paketini kullanmaları gerektiğini belirlemek isteyen ve bu yanıtlardaki çeşitli paketleri gören herkes için, Microsoft'un şöyle dediğine dikkat edin: " Kullanılabilen birkaç python SQL sürücüsü var. Ancak, Microsoft test çabalarını ve güvenini pyodbc sürücüsüne yerleştiriyor . "
jeremysprofile

Yanıtlar:


147

Ben böyle yaparım ...

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

İlgili kaynaklar:


63

Daha önce söylenenlere küçük bir ekleme. Muhtemelen bir veri çerçevesi döndürmek istersiniz. Bu şu şekilde yapılacaktır

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

Bir istemci ve sunucu arasındaki veri kaynağı bağlantılarında iki genel tür vardır: DRIVER kullanan ODBC ve PROVIDER kullanan OLEDB. Ve programlama dünyasında, veri kaynaklarına bağlanırken hangi yolun gideceği düzenli bir tartışmadır .

Bir sağlayıcı kullanıyorsunuz SQLOLEDB, ancak bunu bir sürücü olarak belirliyorsunuz. Bildiğim kadarıyla ne pyodbc ne de pypyodbc modülleri Window OLEDB bağlantılarını desteklemiyor. Ancak, Microsoft ADO'yu temel bileşen olarak kullanan adodbapi yapar.

Aşağıda bağlantı parametreleriniz için her iki yaklaşım da verilmiştir. Ayrıca, birleştirme işleminiz dize içindeki tırnak işaretlerini düzgün bir şekilde kırmadığı için değişkenlerinizi dize biçimlendiriyorum . Bağlantı dizesinde gerekli olduğundan ve onu kullandığından küme parantezlerini ikiye katladığımı fark edeceksiniz 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()

Açıklama ve kod için teşekkürler, sürücünün çalışmasını sağladım. Yine de .formattan (...) kurtulmam ve değişkenleri uygun yerlere koymam gerekti. Biçim ne yapmalıydı?
Christopher Ell

1
adodbapiOLEDB bağlantısını kullanmak için kurmanız gerekir . Ve dize biçimi, +operatör kullanmak yerine değişkenleri bir dizeye geçirmek için önerilen yoldur . Rakamlı küme parantezleri format(), buna göre doldurulan yer tutuculardır . Hatta kullanarak listeleri ve tuplları bile aktarabilirsiniz format(). Orijinal kodunuz dizeyi ve değişkenleri tırnak işaretlerine göre bölmedi, bu nedenle +dizenin parçası olarak kabul edildi.
Parfait

4
Bu cevap harika olsa da sorunu çözmeme yardımcı oldu. bunu kim yapmaya çalışıyorsa, güvenilir bağlantı = evet olarak ayarlarsanız ve UID / pwd'yi aynı bağlantı dizesine girerseniz bir istisna ile karşılaşabileceğinizi unutmayın. Bu bir / veya kombinasyondur ve güvenilir bağlantı kullandığınızda, NT / sistem kimlik bilgileriniz, UID / PWD'den açıkça bahsediyor olsanız bile kimlik doğrulama için kullanılır.
S4nd33p


4

Pytds kullanmayı deneyin, daha karmaşık ortamlarda çalışır pyodbcve kurulumu daha kolaydır.

Ubuntu 18.04'te çalışmasını sağladım

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

Belgelerdeki örnek kod:

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

1
Teşekkür ederim. Herhangi bir karmaşık kurulum olmadan bir sihir gibi çalışır.
Shubham Patel

3

Python kodunu takip etmek benim için çalıştı. ODBC bağlantısını kontrol etmek için önce aşağıda listelendiği gibi 4 satırlı bir C # konsol uygulaması oluşturdum.

Python Kodu

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

Kayıtlı bir Prosedürü Çağırma

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

ODBC Bağlantısını Kontrol Etmek için C # Programı

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

1

Aşağıdaki şekillerde sql sunucusuna bağlanmaya çalıştım ve bunlar benim için çalıştı.

Windows kimlik doğrulamasını kullanarak bağlanmak için

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 sunucu kimlik doğrulamasını kullanmak için aşağıdaki kodu kullandım.

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

1

Şunu deneyin 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)

Çıktı:

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)

Bağlantı, tek bir kod satırı ile terminalden de kontrol edilebilir sqlcmd. Söz dizimine bakın .

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

çıktı:

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

0

Alternatif bir yaklaşım olacağını yüklemeden Microsoft ODBC sürücüsü 13, daha sonra değiştirmek SQLOLEDBileODBC Driver 13 for SQL Server

Saygılarımızla.


0

işte benim için işe yarayan:

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

Burada güncel kaynaklar buldum: Microsoft | SQL Belgeleri | Python SQL Sürücüsü

Gerekli tüm ön koşulları ve kod örneklerini içeren bu iki seçenek açıklanmıştır: Python SQL sürücüsü - pyodbc (test edilmiş ve çalışıyor) Python SQL sürücüsü - pymssql


Merhaba - Stack Overflow'a Hoş Geldiniz - soruyu bazı fikirlerle ele almayı hedeflemelisiniz (bu durumda yeni fikirler) - Kendi kodunuzdan bazıları veya yeni bir yaklaşım. Ardından, daha fazla yardım sağlamak veya çözümünüzü yedeklemek için bazı bağlantıları kullanın. Sadece bazı bağlantılar göndermemelisiniz.
Alex Leo

0

Benim versiyonum. Umarım yardımcı olur.


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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.