如何用指定SQL Server地址创建SQLAlchemy引擎并解决连接错误?
我正尝试从新服务器连接托管的Microsoft SQL Server数据库,但不确定SQLAlchemy create_engine函数的正确连接字符串。我的代码如下:
driver = 'SQL Server' server = 'test-sql2017.xxxx.ttttttt.com' database = 'reporting' user = 'username' pw = 'password' conn_string = f"""DRIVER={driver};SERVER={server};DATABASE={database};UID={user};PWD={pw};""" connection_url = URL.create("mssql+pyodbc", query={"odbc_connect": conn_string}) engine = sa.create_engine(connection_url) query = 'yyyyy' data = pd.read_sql(query, engine)
运行代码时遇到如下错误:
OperationalError: (pyodbc.OperationalError) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect);
[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). (53)')
更新ODBC驱动
你当前使用的'SQL Server'是旧版驱动,兼容性较差。建议替换为最新的'ODBC Driver 17 for SQL Server'或'ODBC Driver 18 for SQL Server',旧驱动可能不支持TLS加密等现代连接要求,这是导致连接失败的常见原因。指定端口号
如果SQL Server未使用默认的1433端口,需在服务器地址后追加端口,格式为服务器地址,端口,例如'test-sql2017.xxxx.ttttttt.com,1433'。具体端口可联系数据库管理员确认。排查网络连通性
在新服务器上执行以下操作验证网络:- 用
ping test-sql2017.xxxx.ttttttt.com检查服务器地址能否正常解析 - 用
telnet test-sql2017.xxxx.ttttttt.com 1433(替换为实际端口)测试端口是否开放
若ping失败,需排查DNS配置;若telnet失败,可能是本地或服务器端防火墙拦截了连接。
- 用
验证账号权限
确认使用的username和password具备远程连接目标数据库reporting的权限,且账号未被锁定、密码未过期。可尝试用SQL Server Management Studio(SSMS)从新服务器用相同账号连接,快速验证权限有效性。简化连接字符串写法
可以直接使用SQLAlchemy的URL格式构造引擎,避免手动拼接ODBC字符串,示例:engine = sa.create_engine(f"mssql+pyodbc://{user}:{pw}@{server}/{database}?driver=ODBC+Driver+17+for+SQL+Server")
内容的提问来源于stack exchange,提问作者bwainwright

