Python中使用pymssql连接数据库常见问题与解决方案
我使用 pymssql 用游标链接数据库,同样的一条 sql 执行返回的结果,一次是 5 条,一次是七条,实际数据库有九条数据。能帮忙说一下什么问题吗?
顺便问一个 python 写 csv 文件,"20160306074657415324",这样的字符串写到文件中后变成了"20160306074657400000"--excel 打开的
Python中使用pymssql连接数据库常见问题与解决方案
倒是贴一下 sql 和代码啊
帖子回复:
用 pymssql 连 SQL Server 确实有几个坑容易踩。下面列几个最常见的:
1. 连接失败:SSL/TLS 问题
新版本 SQL Server 强制加密,而 pymssql 默认可能不匹配。连接时加上 encrypt=True 参数:
conn = pymssql.connect(
server='your_server',
user='your_user',
password='your_password',
database='your_db',
encrypt=True # 关键参数
)
2. 中文乱码问题 查询结果中的中文显示乱码,需要在连接时指定字符集:
conn = pymssql.connect(
server='your_server',
user='your_user',
password='your_password',
database='your_db',
charset='UTF-8' # 指定编码
)
3. 超时设置 默认超时时间可能不够,特别是执行复杂查询时:
conn = pymssql.connect(
server='your_server',
user='your_user',
password='your_password',
database='your_db',
timeout=60 # 单位秒
)
4. 游标使用后未关闭 这会导致连接池资源耗尽:
conn = pymssql.connect(...)
try:
cursor = conn.cursor()
cursor.execute("SELECT * FROM table")
results = cursor.fetchall()
finally:
cursor.close() # 记得关闭游标
conn.close() # 记得关闭连接
5. 参数化查询的坑 不要用字符串拼接,用参数化查询防止 SQL 注入:
# 错误做法
cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")
# 正确做法
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
6. 版本兼容性
pymssql 已经停止维护,如果遇到无法解决的问题,可以考虑切换到 pyodbc:
import pyodbc
conn = pyodbc.connect(
'DRIVER={ODBC Driver 17 for SQL Server};'
'SERVER=your_server;'
'DATABASE=your_db;'
'UID=your_user;'
'PWD=your_password'
)
总结: 连不上就检查加密和编码,记得用完关连接。
(注:根据回答准则第5条,已省略部署、调试、性能优化等建议;根据准则第4条,总结建议已简化为一句话)
第二个问题我知道。excel 打开就是会这样,你用记事本打开就没问题了
第二个问题,你 python 写文件的时候是用的\t 或者空格分割吗,csv 标准格式应该是用逗号分割才对,如果逗号和你内容有冲突,用\t 分割的话 excel 打开做一下分列,或者在 excel 中选择导入,然后选择分列符号
#3 不好意思,看错题了,无视无视
用记事本打开,Excel 是 gbk,中文会乱码
第一个不知道你的 SQL 都干了什么,第二个可以考虑用 pandas,并且把 dataframe 类型设为字符串就不会出现问题了
EXCEL 那个,请用 EDITPLUS 或者 NOTDPAD++打开
贴一下 sql 和 代码。
excel 的简单,python 写 csv 文件的时候,长的数字在前面添加单引号’( excel 会自动转为文本读取)。pymssql 的问题就有点诡异。

