PyCharm中使用pymssql执行SQL日期查询出现字符串拼接报错如何解决
问题修复说明
错误原因
- 直接触发报错的原因是整数类型不能直接和字符串拼接:你代码中将整数
10直接用+和SQL字符串拼接,Python不允许不同类型变量直接拼接,因此抛出TypeError。 - 你还存在2个隐藏问题:
- 变量名不匹配:你定义的数据库账号密码变量为
username、password,但连接时调用了未定义的sqlusername、sqlpassword,后续运行到连接步骤会触发变量未定义报错。 - SQL语法缺失括号:原SQL中
DATEADD部分外层有括号包裹,你拼接的SQL里漏写了左括号,即使解决了拼接问题也会触发SQL语法错误。
- 变量名不匹配:你定义的数据库账号密码变量为
最优修复方案(推荐参数化查询,避免SQL注入风险,也无需手动处理类型转换)
import requests import json from datetime import datetime import pymssql server = 'devserver' database = 'devdb' username = 'devuser' password = 'passwd' # 修复变量名错误 cnxn = pymssql.connect(server, username, password, database) query = """select ms.Ename as Name, ms.DateTimeStamp, s.Author from Spt s, Mst ms where s.MstID = ms.MstID and s.Version = ms.CurrentVersion and ms.DateTimeStamp > (SELECT DATEADD(day, -%s, GETDATE())) order by ms.DateTimeStamp ; """ cursor = cnxn.cursor() # 执行查询时传入参数,pymssql会自动处理类型转换 cursor.execute(query, (10,)) rows = cursor.fetchall() cursor.close() cnxn.close() print(rows)
临时修复方案(仅解决拼接问题,不推荐生产环境使用)
如果你一定要手动拼接SQL的话,将整数10转成字符串即可:
query = "select ms.Ename as Name, " \ "ms.DateTimeStamp, s.Author " \ "from Spt s, Mst ms " \ "where s.MstID = ms.MstID " \ "and s.Version = ms.CurrentVersion " \ "and ms.DateTimeStamp > (SELECT DATEADD(day, -" + str(10) + ", GETDATE())) " \ "order by ms.DateTimeStamp ; "
内容的提问来源于stack exchange,提问作者Deepak P G
相关产品推荐
相关产品推荐

