使用 Python 连接到 Microsoft SQL Server

我正在尝试通过 python 连接到 SQL,以便在一些 SQL 数据库上运行一些查询 Microsoft SQL Server。从我在网上和论坛上的研究来看,最有前途的图书馆似乎是 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 链接进行过连接,这部分是我上面的代码所基于的,所以我不认为我需要安装任何其他东西。

错误: (& # 39; IM002 & # 39; ,& # 39; [ IM002][ unixODBC ][驱动程序管理器]数据源名称未找到,没有指定默认驱动程序(0)(SQLDriverConnect) & # 39;)

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

谢谢

378992 次浏览

在客户端和服务器之间的数据源连接中有两种常见类型: 使用 DRIVER 的 ODBC 和使用 PROVIDER 的 OLEDB。在编程世界中,连接到数据源的路径是 定期辩论

您正在使用提供程序 SQLOLEDB,但是将其指定为驱动程序。据我所知,pyodbc 和 pypyodbc 模块都不支持 WindowOLEDB 连接。但是,adodbapi使用 MicrosoftADO 作为基础组件。

Below are both approaches for your connection parameters. Also, I 字符串格式 your variables as your concatenation did not properly break quotes within string. You'll notice I double the curly braces since it is needed in connection string and string.format() also uses it.

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

我就是这么做的。

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

相关资源:

另一种方法是 安装 Microsoft ODBC Driver 13,然后用 ODBC Driver 13 for SQL Server替换 SQLOLEDB

问候。

对前面所说的内容做了一点小小的补充。您可能希望返回一个数据框架。这将按如下方式进行

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)

我更喜欢这样... 这样容易多了

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

尝试使用 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()

遵循 Python 代码对我很有用。为了检查 ODBC 连接,我首先创建了一个4行的 C # 控制台应用,如下所示。

巨蟒代 a

import pandas as pd
import pyodbc
cnxn = pyodbc.connect("Driver={SQL Server};Server=serverName;UID=UserName;PWD=Password;Database=My_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'] )

检查 ODBC 连接的 C # 程序

    static void Main(string[] args)
{
string connectionString = "Driver={SQL Server};Server=serverName;UID=UserName;PWD=Password;Database=My_DW;";
OdbcConnection cn = new OdbcConnection(connectionString);
cn.Open();
cn.Close();
}

这个对我有用:

from sqlalchemy import create_engine
import urllib
import pandas


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))
sqlcmd = """select * from information_schema.tables"""
df = pd.read_sql(sqlcmd, engine)

我在这里找到了最新的资源: 微软 | SQL 文档 | Python SQL 驱动程序

下面解释了这两个选项,包括所需的所有先决条件和代码示例: Python SQL 驱动程序-pyodbc (测试和工作) Python SQL 驱动程序-pymssql

我的版本,希望能有帮助。


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


我尝试用以下方法连接 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")

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

我就是这样做的。

import pyodbc




connection = pyodbc.connect("DRIVER={SQL Server Native Client 10.0};"

"SERVER=server_name;"

"DATABASE=database_name;"

"UID=user_id_of_database;"

"PWD=password_of_database;")



cursor = connection.cursor()

cursor.execute('SELECT * FROM Table')



始终确保您指定了正确的驱动程序。您可以按照下面给出的步骤检查您的驱动程序。

  1. 打开 Windows 控制面板。
  2. 打开“管理工具”文件夹。
  3. 双击“数据源”(ODBC)以打开“ ODBC 数据源管理员”窗口。
  4. 单击“驱动程序”选项卡