Kết nối với máy chủ Microsoft SQL bằng Python


97

Tôi đang cố gắng kết nối với SQL thông qua python để chạy một số truy vấn trên một số cơ sở dữ liệu SQL trên máy chủ Microsoft SQL. Từ nghiên cứu của tôi trực tuyến và trên diễn đàn này, thư viện hứa hẹn nhất dường như là pyodbc. Vì vậy, tôi đã tạo đoạn mã sau

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

và gặp lỗi sau

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

Tôi đã xem các bài đăng sau đó và thử thay đổi trình điều khiển của mình thành {sql server} và đã kết nối bằng liên kết ODBC trước đây trong SAS, đây là một phần dựa trên mã ở trên của tôi, vì vậy đừng nghĩ rằng tôi cần cài đặt bất kỳ thứ gì khác.

pyodbc.Error: ('IM002', '[IM002] [unixODBC] [Trình quản lý trình điều khiển] Không tìm thấy tên nguồn dữ liệu và không có trình điều khiển mặc định nào được chỉ định (0) (SQLDriverConnect)')

Pyodbc - "Không tìm thấy tên nguồn dữ liệu và không có trình điều khiển mặc định nào được chỉ định"

Cảm ơn

Câu trả lời:


145

Đây là cách tôi làm điều đó ...

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

Các nguồn liên quan:


61

Bổ sung nhỏ cho những gì đã được nói trước đây. Bạn có thể muốn trả về một khung dữ liệu. Điều này sẽ được thực hiện như

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

Trong các kết nối nguồn dữ liệu giữa máy khách và máy chủ, có hai loại chung: ODBC sử dụng DRIVER và OLEDB sử dụng PROVIDER. Và trong thế giới lập trình, việc kết nối với các nguồn dữ liệu là một cuộc tranh luận thường xuyên .

Bạn đang sử dụng một trình cung cấp SQLOLEDB, nhưng chỉ định nó làm trình điều khiển. Theo như tôi biết, cả mô-đun pyodbc và pypyodbc đều không hỗ trợ kết nối Window OLEDB. Tuy nhiên, adodbapi sử dụng Microsoft ADO làm thành phần cơ bản.

Dưới đây là cả hai cách tiếp cận cho các thông số kết nối của bạn. Ngoài ra, tôi định dạng chuỗi các biến của bạn vì việc nối của bạn không ngắt đúng dấu ngoặc kép trong chuỗi. Bạn sẽ nhận thấy tôi nhân đôi dấu ngoặc nhọn vì nó cần thiết trong chuỗi kết nối và string.format()cũng sử dụng nó.

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

Cảm ơn vì lời giải thích và mã, tôi đã có một trình điều khiển để làm việc. Mặc dù tôi đã phải loại bỏ .format (...) và đặt các biến ở những vị trí thích hợp. Định dạng được dùng để làm gì?
Christopher Ell,

1
Bạn cần cài đặt adodbapiđể sử dụng kết nối OLEDB. Và định dạng chuỗi là cách được khuyến nghị để chuyển các biến vào một chuỗi thay vì sử dụng +toán tử. Dấu ngoặc nhọn với số là phần giữ chỗ format()sẽ điền vào tương ứng. Bạn thậm chí có thể chuyển vào danh sách và bộ giá trị bằng cách sử dụng format(). Mã ban đầu của bạn không ngắt chuỗi và các biến bằng dấu ngoặc kép, do đó +được coi là một phần của chuỗi.
Parfait

4
Mặc dù câu trả lời này rất hay và đã giúp tôi giải quyết vấn đề. bất cứ ai đang cố gắng làm điều đó hãy nhớ rằng bạn có thể nhận được một ngoại lệ nếu bạn đặt kết nối đáng tin cậy = yes và nhập UID / pwd trong cùng một chuỗi kết nối. Đây là một hoặc / hoặc kết hợp & khi bạn sử dụng kết nối đáng tin cậy, thông tin đăng nhập hệ thống / NT của bạn sẽ được sử dụng để xác thực ngay cả khi bạn đang đề cập rõ ràng đến UID / PWD.
S4nd33p

15

Tôi thích cách này hơn ... nó dễ dàng hơn nhiều

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
Dự án này đã bị ngừng: github.com/pymssql/pymssql
Pablo EM

NHƯNG! đến tháng 8 năm 2020 nó không còn mất giá nữa. bạn có thể thấy repo hoạt động trở lại: github.com/pymssql/pymssql
deweydb

13

Đây là một số bức ảnh dành cho người mới.

nhập mô tả hình ảnh ở đây


4

Hãy thử sử dụng pytds, nó hoạt động trong môi trường phức tạp hơn pyodbcvà dễ thiết lập hơn.

Tôi đã làm cho nó hoạt động trên Ubuntu 18.04

Tham khảo: https://github.com/denisenkom/pytds

Mã ví dụ trong tài liệu:

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

1
Cảm ơn bạn. Hoạt động như một sự quyến rũ mà không cần bất kỳ thiết lập phức tạp nào.
Shubham Patel

3

Mã Python sau đã làm việc cho tôi. Để kiểm tra kết nối ODBC, trước tiên tôi đã tạo một ứng dụng bảng điều khiển C # 4 dòng như được liệt kê bên dưới.

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

Gọi một thủ tục đã lưu trữ

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

Chương trình C # để kiểm tra kết nối 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

Một cách tiếp cận thay thế sẽ là cài đặt Microsoft ODBC Driver 13, sau đó thay thế SQLOLEDBbằngODBC Driver 13 for SQL Server

Trân trọng.


0

đây là một trong những hoạt động cho tôi:

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

Tôi đã tìm thấy các tài nguyên cập nhật ở đây: Microsoft | Tài liệu SQL | Trình điều khiển SQL Python

Có hai tùy chọn này được giải thích bao gồm tất cả các điều kiện tiên quyết cần thiết và các ví dụ về mã: Trình điều khiển SQL Python - pyodbc (đã thử nghiệm và đang làm việc) Trình điều khiển SQL Python - pymssql


Xin chào - Chào mừng bạn đến với Stack Overflow - bạn nên giải quyết câu hỏi bằng một số ý tưởng (ý tưởng mới trong trường hợp này) - Một số mã của riêng bạn hoặc một cách tiếp cận mới. Sau đó, sử dụng một số liên kết để cung cấp thêm viện trợ hoặc sao lưu giải pháp của bạn. Bạn không nên chỉ đăng một số liên kết.
Alex Leo

0

Phiên bản của tôi. Hy vọng nó giúp.


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

Tôi đã cố gắng kết nối máy chủ sql theo những cách sau và những cách đó hiệu quả với tôi.

Để kết nối bằng xác thực 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")

Để sử dụng xác thực máy chủ sql, tôi đã sử dụng mã sau.

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

Hãy thử với 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)

Đầu ra:

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)

Kết nối cũng có thể được kiểm tra từ thiết bị đầu cuối, với một dòng mã duy nhất với sqlcmd. Xem cú pháp .

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

đầu ra:

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.)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.