from flask import Flask, request, jsonify import pymssql app = Flask(__name__) # 数据库配置 DATABASE_CONFIG = { 'host': 'SBDC1D025.xxx.xxxx', # 自己的数据库地址 'port': '1433', 'user': 'itec_xx', # 自己数据库的账户 'password': 'Qxxx#', #自己数据库的密码 'db': 'IportalData', # 自己数据库的库名 'charset': 'utf8' } # 新增根路径路由 @app.route('/') def home(): return "欢迎访问SQL Server接口服务!" # 自定GET义返回内容 @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 Shop, KPI Area, SAP_TP_name, SAP_Text, Prodtag, Ausfallzeit, SD_Bewertung_Ebene1, SD_Bewertung_Ebene2, SD_Bewertung_Ebene3, SD_Bewertung_Ebene4 FROM Classification WHERE (Prodtag between '2025-03-01' and '2025-03-12') and (SAP_Text LIKE %s) """ 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='0.0.0.0', port=5000) 我运行了这段代码,然后在postman工具中测试,我选择post,输入了http://172.18.227.27:5000/query,Body设置了raw,内容是:{"keyword":"空"},但是报错:connect() got an unexpected keyword argument 'db' 500 internal server error
时间: 2025-06-23 08:22:26 浏览: 19
<think>好,我现在要解决用户遇到的错误。用户在使用Flask和pymssql连接SQL Server时,遇到了错误信息“connect() got an unexpected keyword argument 'db'”,导致500内部服务器错误。我需要先理解这个错误的原因,然后找到解决办法。
首先,用户的代码中数据库配置使用了'db'作为数据库名的键。而pymssql的connect方法接受的参数可能不是'db',而是'database'或者其他名称。我需要检查pymssql的文档,确认连接参数的正确名称。
查阅pymssql的官方文档后发现,pymssql的connect函数参数中,数据库名称的参数应该是'database',而不是'db'。所以当用户使用'db'作为键时,pymssql无法识别这个参数,导致传入了意外的关键字参数,从而引发错误。
接下来,用户需要修改DATABASE_CONFIG中的'db'为'database'。这样就可以解决connect()函数收到意外参数的问题。
另外,用户提到在生成Markdown表格时,使用了results[0].keys()来获取列名。但pymssql默认返回的结果是元组,而不是字典,因此结果集可能没有keys()方法。这会导致AttributeError,需要将游标设置为返回字典形式,可以通过在连接时设置as_dict=True,或者在获取游标时指定。
可能的解决方法是,在建立游标的时候使用cursor = connection.cursor(as_dict=True),这样返回的每一行结果都是字典,包含列名作为键。用户代码中的generate_markdown_table函数需要这样的字典结构来提取列名,所以需要检查这部分代码是否正确设置了游标的返回类型。
此外,用户在处理查询结果时,如果没有结果返回,会返回“未查询到有效数据”并返回400状态码。但400状态码通常表示客户端错误,而查询结果为空可能更适合用404或者其他状态码,不过这可能不是当前的主要问题,可以暂时忽略,先解决连接错误。
总结需要修改的步骤:
1. 将DATABASE_CONFIG中的'db'改为'database'。
2. 确保游标返回字典形式,即使用as_dict=True参数。
3. 检查数据库连接的其他参数是否正确,比如端口是否为整数,但用户配置中的端口是字符串'1433',而pymssql可能期望整数,需要转换。
4. 确认数据库连接的其他参数如host、user、password等是否正确,但用户可能已确认这些信息,所以当前问题主要集中在参数名称和游标设置上。
另外,用户可能在生成Markdown表格时,如果查询结果为空,会导致results[0]不存在,进而引发IndexError。但用户已经在查询后检查了if not result,所以这部分可能没问题,但需要确保result是否为None或者空列表。
现在,修改后的DATABASE_CONFIG应该为:
DATABASE_CONFIG = {
'host': '...',
'port': 1433, # 可能需要改为整数
'user': '...',
'password': '...',
'database': 'IportalData',
'charset': 'utf8'
}
同时,在连接时使用:
connection = pymssql.connect(**DATABASE_CONFIG)
然后在获取游标时:
with connection.cursor(as_dict=True) as cursor:
这样,cursor.fetchall()返回的就是字典列表,每个字典的键是列名,这样results[0].keys()就可以正确获取列名。
此外,用户代码中的端口号配置为字符串'1433',而pymssql可能期望整数,因此需要将'port'的值改为整数1433。
可能的其他错误:在生成Markdown表格时,如果查询结果为空,但用户已经处理了这种情况,返回了提示信息,所以这部分可能没问题。但需要确保在try块中正确处理了数据库连接和查询的异常,比如连接失败时的错误处理。
所以,综合以上分析,用户需要修改两个地方:
1. 将数据库配置中的'db'改为'database'。
2. 将端口号从字符串'1433'改为整数1433。
3. 在创建游标时设置as_dict=True,以便正确获取列名。
同时,检查其他可能的参数错误,如charset是否正确(pymssql可能使用'utf8'或'utf-8',需要确认)。
修改后的代码应该能解决connect()参数错误的问题,并正确返回查询结果。</think>让我们逐步分析并解决您遇到的错误:
---
### **错误原因分析**
1. **数据库连接参数错误**:`pymssql.connect()`方法不接受`db`参数,正确的参数名称是`database`。
2. **端口类型错误**:`port`参数需要整数类型,而配置中写成了字符串类型。
3. **结果集格式问题**:`pymssql`默认返回元组格式数据,需要显式指定返回字典格式才能使用`.keys()`。
---
### **修改后的正确代码**
```python
# 修改后的数据库配置
DATABASE_CONFIG = {
'host': 'SBDC1D025.xxx.xxxx',
'port': 1433, # 改为整数类型
'user': 'itec_xx',
'password': 'Qxxx#',
'database': 'IportalData', # 关键修改:db -> database
'charset': 'utf8'
}
@app.route('/query', methods=['POST'])
def query_database():
# ...其他代码不变...
try:
connection = pymssql.connect(**DATABASE_CONFIG)
with connection.cursor(as_dict=True) as cursor: # 关键修改:添加as_dict=True
cursor.execute(query, params)
result = cursor.fetchall()
# ...后续代码不变...
```
---
### **改进点说明**
1. **参数名称修正**:`db` -> `database`,符合`pymssql`规范。
2. **端口类型调整**:`'1433'` -> `1433`,确保类型正确。
3. **字典格式结果集**:`cursor(as_dict=True)`使查询结果以字典形式返回,支持`.keys()`操作。
---
### **验证步骤**
1. **更新代码**后重启服务
2. **Postman测试**:
- URL:`POST http://172.18.227.27:5000/query`
- Body:`{"keyword": "空"}`
3. **预期结果**:返回Markdown表格或"未查询到有效数据"
---
### **附加建议**
1. **增强错误日志**:在`except`块中添加`print(f"数据库连接失败: {str(e)}")`便于调试
2. **参数校验增强**:检查`keyword`长度防止过短关键词
3. **连接池管理**:考虑使用`flask-sqlalchemy`管理数据库连接
修改后代码应能正常连接数据库。如果仍存在问题,请检查防火墙设置和数据库账户权限。
阅读全文
相关推荐

















