【发布时间】:2021-03-11 10:19:54
【问题描述】:
我能找到的大多数显示使用 Python 的完整 MSSQL 连接方法的示例在几个月前已经过时,部分原因是 SQLAlchemy 1.3 中的一些优化。我正在尝试复制我在文档中看到的内容。
我无法使用 pyodbc 将 SQLAlchemy 连接到 MSSSQL Server。
我有一个本地 SQL 服务器,可以从 SQL Server Management Studio 访问:#DESKTOP-QLSOTTG\SQLEXPRESS
数据库是:TestDB
用户名,对于这个例子是:TestUser
密码,对于这个例子是:TestUserPass
我想运行一个将 pandas 数据框导入 MSSQL 数据库的测试用例(用例?),以便找出最快的处理方式。但是,这个问题的目的是围绕连接性。
致谢:我从 Gord 借用了一些代码用于数据帧/更新 here。
import pandas as pd
import numpy as np
import time
from sqlalchemy import create_engine, event
from urllib.parse import quote_plus
# for pyodbc
#engine = create_engine('mssql+pyodbc://TestUser:TestUserPAss@DESKTOP-QLSOTTG\\SQLEXPRESS:1433/TestDB?driver=ODBC+Driver+17+for+SQL+Server', fast_executemany=True)
engine = create_engine("mssql+pyodbc://TestUser:TestUserPass@DESKTOP-QLSOTTG\\SQLEXPRESS:1433/TestDB?driver=ODBC+Driver+13+for+SQL+Server", fast_executemany=True)
# test data
num_rows = 10000
num_cols = 100
df = pd.DataFrame(
[[f'row{x:04}col{y:03}' for y in range(num_cols)] for x in range(num_rows)],
columns=[f'col{y:03}' for y in range(num_cols)]
)
t0 = time.time()
df.to_sql("sqlalchemy_test", engine, if_exists='replace', index=None)
print(f"pandas wrote {num_rows} rows in {(time.time() - t0):0.1f} seconds")
我收到的错误如下。我将假设服务器“主动拒绝连接”是因为我的连接字符串以某种方式搞砸了,但我似乎不明白为什么。:
OperationalError: (pyodbc.OperationalError) ('08001', '[08001] [Microsoft][ODBC Driver 13 for SQL Server]TCP Provider: No connection could be made because the target machine actively refused it.\r\n (10061) (SQLDriverConnect); [08001] [Microsoft][ODBC Driver 13 for SQL Server]Login timeout expired (0); [08001] [Microsoft][ODBC Driver 13 for SQL Server]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online. (10061)')
(Background on this error at: http://sqlalche.me/e/13/e3q8)
可以从 SQL Server Management Studio 连接数据库和用户。*
对我可能遗漏的内容有什么想法吗?
注意事项:
- 将 DESKTOP-QLSOTTG\SQLEXPRESS:1433 更改为 DESKTOP-QLSOTTG:1433 并没有改变错误
- 将 DESKTOP-QLSOTTG\SQLEXPRESS:1433 更改为 localhost:1433 并没有改变错误
- 将 DESKTOP-QLSOTTG\SQLEXPRESS:1433 更改为 localhost\SQLEXPRESS:1433 并没有改变错误
【问题讨论】:
-
未来的读者应该注意(1) SQL Server Express Edition (SQLEXPRESS) 的默认安装不 侦听端口 1433,并且 (2) 在指定 SQL Server 实例时,应使用
SERVER_NAME\INSTANCE_NAME或SERVER_NAME:PORT_NUMBER,而不是两者。 -
谢谢@GordThompson,这很好。我相信这同样适用于新命名法下的 SQL Developer Edition。
标签: python sql-server pandas sqlalchemy