การเชื่อมต่อกับเซิร์ฟเวอร์ 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] [Driver Manager] ไม่พบชื่อแหล่งข้อมูลและไม่มีการระบุไดรเวอร์เริ่มต้น (0) (SQLDriverConnect)')

Pyodbc - "ไม่พบชื่อแหล่งข้อมูลและไม่ได้ระบุไดรเวอร์เริ่มต้น"

ขอบคุณ


นี่คือภาพบางส่วนสำหรับมือใหม่ ! [ใส่คำอธิบายภาพที่นี่ ] ( i.stack.imgur.com/wLXWQ.png )
แอนดรูว์

คำตอบ:


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 ซึ่งใช้ DRIVER และ OLEDB ซึ่งใช้ PROVIDER และในโลกของการเขียนโปรแกรมก็มีการถกเถียงกันเป็นประจำว่าจะไปเชื่อมต่อกับแหล่งข้อมูลใด

คุณกำลังใช้ผู้ให้บริการ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()เติมตามนั้น คุณยังสามารถผ่านในรายการและ tuples 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
โครงการนี้ถูกยกเลิกแล้ว: github.com/pymssql/pymssql
Pablo EM

1
แต่! ณ เดือนสิงหาคม 2563 จะไม่มีการคิดค่าเสื่อมราคาอีกต่อไป คุณสามารถเห็น repo เปิดใช้งานอีกครั้ง: 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
ขอบคุณ. ใช้งานได้อย่างมีเสน่ห์โดยไม่ต้องตั้งค่าใด ๆ ที่ซับซ้อน
Shubham Patel

3

การติดตามรหัส Python ใช้ได้ผลสำหรับฉัน ในการตรวจสอบการเชื่อมต่อ ODBC ขั้นแรกฉันได้สร้างแอปพลิเคชันคอนโซล C # 4 บรรทัดตามรายการด้านล่าง

รหัส 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()

กำลังเรียก Stored Procedure

 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

นี่คือสิ่งที่เหมาะกับฉัน:

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 - คุณควรตั้งเป้าหมายที่จะตอบคำถามด้วยแนวคิดบางอย่าง (แนวคิดใหม่ในกรณีนี้) - โค้ดของคุณเองหรือแนวทางใหม่ จากนั้นใช้ลิงก์เพื่อให้ความช่วยเหลือเพิ่มเติมหรือสำรองโซลูชันของคุณ คุณไม่ควรโพสต์ลิงก์เพียงบางส่วน
Alex Leo

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.)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.