SQLAlchemy+pyodbc查询返回无键元组列表,需转换为JSON格式
解决SQLAlchemy/pyodbc查询结果转JSON的问题
嘿,我懂你的困扰——返回的元组列表只有值没有对应键,转成JSON完全没法直接用对吧?别担心,咱们只要把元组和查询的列名配对成字典,就能轻松得到结构清晰的JSON啦。下面给你两种实用的解决方法:
方法一:用SQLAlchemy引擎处理(推荐)
既然你已经在用SQLAlchemy,不如直接用它的引擎来连接和查询,获取列名会更省心:
from sqlalchemy import create_engine, text from flask import jsonify # 用SQLAlchemy创建连接引擎 engine = create_engine('mssql+pyodbc:///?odbc_connect=DRIVER={SQL Server};SERVER=你的服务器名;DATABASE=你的数据库名;UID=用户名;PWD=密码') # 执行查询并转换格式 with engine.connect() as conn: # 替换成你的SQL语句 result = conn.execute(text("SELECT id, name, age FROM 你的表名")) # 获取查询结果的列名 column_names = result.keys() # 把每一行元组转换成键值对字典 result_dicts = [dict(zip(column_names, row)) for row in result] # 在Flask接口里直接用jsonify返回即可 return jsonify(result_dicts)
方法二:直接用pyodbc处理列名
如果你习惯用pyodbc直接连接,也可以通过游标获取列名来转换:
import pyodbc from flask import jsonify client = pyodbc.connect('DRIVER={SQL Server};SERVER=你的服务器名;...') # 你的完整连接字符串 cursor = client.cursor() # 执行查询 cursor.execute("SELECT * FROM 你的表名") # 从游标描述中提取列名(description每个元素的第一个值就是列名) column_names = [col[0] for col in cursor.description] # 把所有查询行转成字典列表 result_dicts = [dict(zip(column_names, row)) for row in cursor.fetchall()] # Flask接口中直接返回结构化JSON return jsonify(result_dicts)
原理说明
元组本身只是一组有序的值,没有字段标识。我们通过获取查询语句对应的列名,把每个元组的元素和列名绑定成字典,这样转成JSON后就是标准的键值对结构,不管是前端还是其他服务都能轻松解析。
内容的提问来源于stack exchange,提问作者Ricardo Marquez
相关产品推荐
相关产品推荐

