Python中使用pymssql连接数据库常见问题与解决方案

我使用 pymssql 用游标链接数据库,同样的一条 sql 执行返回的结果,一次是 5 条,一次是七条,实际数据库有九条数据。能帮忙说一下什么问题吗?

顺便问一个 python 写 csv 文件,"20160306074657415324",这样的字符串写到文件中后变成了"20160306074657400000"--excel 打开的


Python中使用pymssql连接数据库常见问题与解决方案
10 回复

倒是贴一下 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 的问题就有点诡异。

回到顶部