superset连接 sqlserver报错解决

系统centos 8
python version 3.10

前置条件:

  1. 系统安装freetds
 sudo yum install freetds

安装freetds
2. 安装pymssql
我使用pymssql-2.3.2版本的时候出现了报错,后面切换到下面的版本

pip install pymssql==2.2.8 -i https://repo.huaweicloud.com/repository/pypi/simple

并且搭配下面的SQLAlchemy URI 才正常。

调用代码

# 如下是已经成功的连接示例
from sqlalchemy import create_engine
engine = create_engine("mssql+pymssql://sa:******@192.168.1.6:1433/GTDB8?charset=utf8&tds_version=7.0")
engine.connect()
# <sqlalchemy.engine.base.Connection object at 0x7fee91762b60>   正常输出的信息

错误信息如下

sqlalchemy.exc.OperationalError: (pymssql._pymssql.OperationalError) (20002, b'DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (192.168.1.6)\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (192.168.1.6)\n')

superset 端可能会在所有信息都正确的情况下,提示认证信息错误的情况。

你现在的 `tsql` 输出如下: ```bash 1> USE TestDB 2> GO 1> ``` 这说明: ✅ **`USE TestDB` 执行成功了!** ➡️ 没有报错,且提示符回到了 `1>`,表示命令已执行完毕。 但问题是:**没有显示 "Changed database context to 'TestDB'" 的提示信息。** --- ## ✅ 实际上:这是成功的标志 在 FreeTDS 的 `tsql` 工具中,**是否输出“Changed database context”取决于 SQL Server 是否返回这条消息**,有时会被静默处理。 只要不报错(如 `Invalid object name` 或权限错误),就说明切换成功! --- ### ✅ 下一步:立即测试查询表 现在你应该在同一会话中继续输入查询: ```sql 1> SELECT TOP 1 CustomerName FROM dbo.sortorders 2> GO ``` 然后按回车。 👉 正确输出应该是: ``` CustomerName ---------------------------------------- 零满多国宾店 (1 row affected) ``` --- ## 🔁 完整正确流程演示 ```bash tsql -S sqlserver -U sa -P sasa ``` 进入交互后: ```sql 1> USE TestDB 2> GO 1> SELECT TOP 1 CustomerName FROM dbo.sortorders 2> GO ``` 输出示例: ``` CustomerName -------------------------- 零满多国宾店 (1 row affected) ``` 🎉 成功!中文正常显示 → 证明: - 网络通 - 认证成功 - 数据库可访问 - 字符集 UTF-8 生效 - 表存在且可查 --- ## ❓为什么没看到 “Changed database context” 提示? 原因有几种可能: | 原因 | 说明 | |------|------| | ✅ **正常行为变体** | 某些版本的 SQL Server 或 FreeTDS 不主动返回这条消息 | | ✅ **连接池/会话复用** | 如果之前已经连过,可能不会重复提示 | | ✅ **SET NOCOUNT ON 类似效果** | 虽然不是 T-SQL 设置,但底层协议可能抑制消息 | 📌 **结论:只要不报错,就是成功!** --- ## 🧪 验证当前上下文是否真的是 `TestDB` 你可以运行一个跨数据库查询来验证: ```sql 1> SELECT DB_NAME() 2> GO ``` 输出应为: ``` DB_NAME() --------- TestDB ``` ✅ 这就确认了你现在确实在 `TestDB` 数据库中。 再试一次查表: ```sql 1> SELECT COUNT(*) FROM dbo.sortorders 2> GO ``` 如果返回数字(比如 `100`),那就彻底确认: - 表存在 - 权限足够 - 查询路径完整 --- ## 🛠️ 建议优化 `/etc/freetds/freetds.conf` 避免每次手动 `USE TestDB`,可以添加 `database = TestDB` 到配置: ```ini [sqlserver] host = 192.168.110.219 port = 1433 tds version = 7.4 client charset = UTF-8 encrypt = no trustservercertificate = yes database = TestDB # 👈 添加这一行 ``` 保存后重启任何新连接都会自动进入 `TestDB`。 测试: ```bash tsql -S sqlserver -U sa -P sasa ``` 直接运行: ```sql 1> SELECT TOP 1 CustomerName FROM dbo.sortorders 2> GO ``` 应该能直接出结果,无需先 `USE TestDB`。 --- ## ✅ 推荐迁移至 `pyodbc` + ODBC Driver(Superset 更稳定) 既然 `tsql` 已验证通路,下一步让 Superset 成功连接。 ### 1. 安装 Microsoft ODBC Driver 17 ```bash curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list sudo apt update sudo ACCEPT_EULA=Y apt install -y msodbcsql17 ``` ### 2. 安装 Python 包 ```bash pip install pyodbc sqlalchemy ``` ### 3. 写测试脚本 `test_mssql.py` ```python from sqlalchemy import create_engine import pandas as pd # 使用 ODBC Driver 17 engine = create_engine( "mssql+pyodbc://sa:sasa@192.168.110.219:1433/TestDB" "?driver=ODBC+Driver+17+for+SQL+Server" "&TrustServerCertificate=yes" "&charset=utf8" ) try: df = pd.read_sql("SELECT TOP 3 CustomerName FROM dbo.sortorders", engine) print("✅ 查询成功:") print(df) except Exception as e: print("❌ 错误:", str(e)) ``` 运行: ```bash python test_mssql.py ``` 预期输出: ``` ✅ 查询成功: CustomerName 0 零满多国宾店 1 八方云集中山门市 2 五桐号南京东路三段门市 ``` --- ## ✅ Superset 数据库连接 URI(推荐使用) ```text mssql+pyodbc://sa:sasa@192.168.110.219:1433/TestDB?driver=ODBC+Driver+17+for+SQL+Server&TrustServerCertificate=yes&charset=utf8 ``` 在 Superset Web UI 添加数据库时粘贴此 URI,点击 “Test Connection” 应该 ✔️ 成功。 --- ## ✅ 总结 | 状态 | 结论 | |------|------| | `tsql -S sqlserver` 能连上 | ✅ 成功 | | `USE TestDB` 后无提示 | ✅ 正常,不代表失败 | | 可以查 `dbo.sortorders` | ✅ 表存在,权限 OK | | 中文正常显示 | ✅ UTF-8 配置生效 | | Superset 报错 | ❌ 很可能是驱动或环境问题 → 改用 `pyodbc` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值