我试图通过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 - "Data source name not found, and no default driver specified"
由于
答案 0 :(得分:102)
我就是这样做的......
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,))
相关来源:
答案 1 :(得分:35)
以前说过的一点点补充。您可能想要返回一个数据帧。这将以
完成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)
答案 2 :(得分:27)
在客户端和服务器之间的数据源连接中,有两种常规类型:使用DRIVER的ODBC和使用PROVIDER的OLEDB。在编程世界中,关于连接数据源的路径是regular debate。
您正在使用提供程序SQLOLEDB
,但将其指定为驱动程序。据我所知,pyodbc和pypyodbc模块都不支持Window OLEDB连接。但是,adodbapi使用Microsoft ADO作为底层组件。
以下是连接参数的两种方法。另外,我string format你的变量,因为你的连接没有正确地破坏字符串中的引号。您会注意到我将花括号加倍,因为连接字符串中需要它,而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()
答案 3 :(得分:12)
我更喜欢这种方式......它更容易
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')
答案 4 :(得分:2)
尝试使用pytds,它可以在比pyodbc
更复杂的环境中工作,并且更易于设置。
我使它可以在Ubuntu 18.04上运行
import pytds
with pytds.connect('server', 'database', 'user', 'password') as conn:
with conn.cursor() as cur:
cur.execute("select 1")
cur.fetchall()
答案 5 :(得分:2)
答案 6 :(得分:1)
以下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'] )
用于检查ODBC连接的C#程序
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();
}
答案 7 :(得分:1)
我尝试通过以下方式连接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")
答案 8 :(得分:1)
尝试使用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
的一行代码。参见syntax。
╔═════════╦═════════════════════════════════════════╗
║ 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.)
答案 9 :(得分:0)
另一种方法是installing Microsoft ODBC Driver 13,然后将SQLOLEDB
替换为ODBC Driver 13 for SQL Server
的问候。
答案 10 :(得分: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))
答案 11 :(得分:0)
我在这里找到了最新的资源: Microsoft | SQL Docs | Python SQL Driver
解释了以下两个选项,包括所需的所有先决条件和代码示例: Python SQL driver - pyodbc(经过测试并可以正常使用) Python SQL driver - pymssql
答案 12 :(得分: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