使用Python连接到Microsoft SQL Server


97

我正在尝试通过python连接到SQL,以便在Microsoft SQL服务器上的某些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},并在SAS中使用ODBC链接进行了连接,这部分是我上面的代码所基于的,因此不必认为我需要安装其他任何东西。

pyodbc.Error :(“ IM002”,“ [IM002] [unixODBC] [驱动程序管理器]找不到数据源名称,并且未指定默认驱动程序(0)(SQLDriverConnect)”)

Pyodbc-“未找到数据源名称,并且未指定默认驱动程序”

谢谢

Answers:


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

在客户端和服务器之间的数据源连接中,有两种常规类型:使用DRIVER的ODBC和使用PROVIDER的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(...)并将变量放在适当的位置。格式是什么意思?
Christopher Ell,2015年

1
您需要安装adodbapi才能使用OLEDB连接。推荐使用字符串格式,而不是使用+运算符将变量传递到字符串中。带数字的花括号是占位符,format()将相应地填充。您甚至可以使用传入列表和元组format()。您的原始代码没有用引号将字符串和变量分开,因此+被认为是字符串的一部分。
2015年

4
虽然这个答案很好,并且可以帮助我解决问题。尝试执行此操作的任何人都请记住,如果将可信连接设置为“是”并在同一连接字符串中输入UID / pwd,则可能会遇到异常。这是一个或一个或多个组合,当您使用可信连接时,即使您明确提到UID / PWD,也将使用NT /系统凭据进行身份验证。
S4nd33p



4

尝试使用pytd,它在比更复杂的环境中均可工作,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连接,我首先创建了一个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 Driver 13,然后替换SQLOLEDBODBC 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

我发现了最新的资源在这里: 微软| 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 server,这些方法对我有用。

使用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

尝试pymssqlpip 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.)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.