from flask import Flask, request, jsonify import pymssql app = Flask(__name__) # 数据库配置 DATABASE_CONFIG = { 'host': '172.16.xx.xxx', # 自己的数据库地址 'port': '1433', 'user': 'user', # 自己数据库的账户 'password': 'Qwert', #自己数据库的密码 'db': 'MRA1_BS_iP_KPI', # 自己数据库的库名 'charset': 'utf8mb4', 'cursorclass': pymssql.Cursor.DictCursor } @app.route('/query', methods=['POST']) def query_database(): print("接收到请求") # 获取关键字 keyword = request.json.get('keyword') print("keyword为:"+keyword) if not keyword: return jsonify({"error": "Keyword is required"}), 400 # 参数化查询,避免 SQL 注入,修改成自己的库 query = "SELECT AnlagenIndex,Prodtag,ProdIst FROM Maico_Schicht" params = ('%' + keyword + '%',) try: # 建立数据库连接 connection = pymssql.connect(**DATABASE_CONFIG) with connection.cursor() as cursor: # 执行查询 cursor.execute(query, params) result = cursor.fetchall() connection.commit() connection.close() if not result: return"未查询到有效数据", 400 # 生成 Markdown 表格 markdown_table = generate_markdown_table(result) return markdown_table, 200 except Exception as e: return str(e), 500 def generate_markdown_table(results): """ 生成 Markdown 表格 """ if not results: return"" # 获取列名 columns = results[0].keys() # 表头 table_md = "| " + " | ".join([col for col in columns]) + " |\n" # 分隔线 table_md += "| " + " --- |" * len(columns) + "\n" # 表格内容 for row in results: table_md += "| " + " | ".join([str(cell) for cell in row.values()]) + " |\n" return table_md if __name__ == '__main__': # 注意这里绑定本机的内容ip,省事点,就0.0.0.0即可。不要绑定127.0.0.1,docker内访问不到 app.run(host='10.1.0.65', port=8000) 我这个代码什么意思给我解读,然后我这里面还报错了:Traceback (most recent call last): File "c:\PycharmProjects\sqlServer\server.py", line 14, in <module> 'cursorclass': pymssql.Cursor.DictCursor ^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: type object 'pymssql._pymssql.Cursor' has no attribute 'DictCursor'
时间: 2025-06-21 17:19:09 浏览: 22
<think>好的,我现在需要帮用户解读他的Flask代码,并解决他遇到的报错问题。首先,用户提供的代码是一个使用Flask和pymssql连接SQL Server的简单后端服务。主要功能是通过POST请求接收关键字,查询数据库并返回Markdown格式的表格。
首先,我应该先通读用户的代码,理解各个部分的作用。代码结构大致分为数据库配置、路由定义、查询处理和生成Markdown表格几个部分。用户遇到的具体错误是在设置`cursorclass`时抛出了`AttributeError`,提示`DictCursor`不存在。这可能是因为pymssql模块中确实没有这个属性,用户可能混淆了其他数据库驱动的用法,比如MySQL的PyMySQL。
接下来,我需要验证pymssql是否支持`DictCursor`。查阅pymssql的官方文档,发现pymssql的游标默认返回的是元组,但可以通过指定`as_dict=True`参数来让游标返回字典形式的结果。因此,用户代码中的`cursorclass`参数是错误的,正确的方法是在创建游标时传入`as_dict=True`。
然后,检查数据库连接部分的代码。用户使用的是pymssql.connect,参数中包含`cursorclass`,而正确的参数应该是创建游标时设置。因此,应该在`with connection.cursor(as_dict=True)`这里修改,而不是在数据库配置中设置。
另外,用户的SQL查询语句中的参数化查询部分可能存在错误。原来的查询语句没有WHERE子句,但参数`params`却被定义为一个包含关键字的元组,这会导致执行时参数无法匹配,可能引发异常。需要检查用户是否遗漏了WHERE条件,导致参数化查询的参数没有被使用,从而引发错误。
此外,生成Markdown表格的函数看起来是正常的,但需要确保查询结果中有数据,否则返回错误信息。用户在处理查询结果时,如果结果为空,返回的是400错误,但正确的做法可能是返回404或者保持200状态码并提示无数据,需要指出这一点。
总结用户代码的问题:
1. 错误使用了`cursorclass`: pymssql中应使用`as_dict=True`来获取字典游标。
2. SQL查询语句中的参数化部分存在逻辑错误,参数未被使用。
3. 错误处理部分可能需要调整HTTP状态码。
4. 数据库连接参数中的`charset`可能不适用,因为SQL Server通常使用UTF-16或服务器端编码,但pymssql可能自动处理。
针对用户提供的错误信息,首要解决的是`DictCursor`不存在的问题。需要指导用户修改游标的创建方式,去掉`cursorclass`配置项,改为在创建游标时指定`as_dict=True`。
另外,需要指出用户代码中的SQL查询没有使用WHERE子句,导致传入的`params`未被使用,这可能是一个逻辑错误,导致无论关键字是什么,都返回所有数据。用户可能需要添加WHERE条件,例如`WHERE Prodtag LIKE %s`,以正确过滤结果。
最后,确保用户了解如何正确运行Flask应用,包括主机和端口设置是否适合其部署环境,比如在Docker中可能需要绑定到0.0.0.0。</think>让我分步解读代码并解决错误:
一、代码功能解读(分5个核心部分)
$$1. \text{Flask服务初始化}$$
- 使用`from flask import Flask`创建Web服务
- 数据库配置参数使用pymssql连接SQL Server
- 配置参数包含中文字符集`utf8mb4`(实际SQL Server默认使用UTF-16)
$$2. \text{路由定义}$$
- POST接口`/query`接收JSON格式请求
- 从请求中提取`keyword`参数
- 缺少keyword时返回400错误
$$3. \text{数据库操作}$$
- 使用参数化查询`cursor.execute(query, params)`防止SQL注入
- 但当前SQL语句缺少WHERE条件(可能是bug)
- 使用`with`自动管理游标
$$4. \text{结果处理}$$
- 查询结果为空时返回400
- 调用`generate_markdown_table`生成表格
$$5. \text{Markdown生成}$$
- 自动识别列名创建表头
- 使用`---`作为分隔符
- 遍历结果集填充数据
二、错误原因分析
$$\text{AttributeError: Cursor 没有 DictCursor 属性}$$
根本原因是*pymssql的参数配置错误*,修正步骤如下:
1. 删除`cursorclass`配置项
```python
# 错误配置
'cursorclass': pymssql.Cursor.DictCursor
# 正确配置(删除该行)
DATABASE_CONFIG = {
'host': '172.16.xx.xxx',
'port': '1433',
'user': 'user',
'password': 'Qwert',
'db': 'MRA1_BS_iP_KPI',
'charset': 'utf8mb4' # 删除cursorclass配置
}
```
2. 修改游标创建方式
```python
with connection.cursor(as_dict=True) as cursor: # 添加as_dict参数
cursor.execute(query, params)
```
三、潜在问题及修复建议
$$1. \text{SQL语句问题}$$
当前查询语句:
```sql
SELECT ... FROM Maico_Schicht
```
缺少WHERE条件导致参数`params`无效,应改为:
```sql
SELECT AnlagenIndex,Prodtag,ProdIst
FROM Maico_Schicht
WHERE Prodtag LIKE %s -- 增加WHERE条件
```
$$2. \text{状态码问题}$$
当查询结果为空时返回400(客户端错误)不合理,建议修改:
```python
if not result:
return "未查询到有效数据", 404 # 改为404 Not Found
```
$$3. \text{编码问题}$$
SQL Server建议使用以下配置:
```python
DATABASE_CONFIG = {
# 其他配置...
'charset': 'UTF-8', # 修改为UTF-8
'tds_version': '7.4' # 添加TDS协议版本
}
```
四、完整修复代码
关键修改部分:
```python
# 连接配置修正
DATABASE_CONFIG = {
'host': '172.16.xx.xxx',
'port': 1433, # 端口改为int类型
'user': 'user',
'password': 'Qwert',
'database': 'MRA1_BS_iP_KPI', # 关键字段名修改
'tds_version': '7.4'
}
# 修改后的查询方法
query = """
SELECT AnlagenIndex,Prodtag,ProdIst
FROM Maico_Schicht
WHERE Prodtag LIKE %s
"""
params = ('%' + keyword + '%',)
```
建议使用Docker运行前检查:
1. 确认1433端口在防火墙开放
2. 使用`telnet 172.16.xx.xxx 1433`测试连接
3. 安装pymssql最新版:`pip install pymssql==2.2.7`
阅读全文
相关推荐

















