python - SQLAlchemy _asdict() 方法只返回一列
问题描述
我正在尝试将 SQLAlchemy 查询中返回的行转换为字典。当我尝试使用 ._asdict() 方法时,我只得到结果中第一列的键值对。
我应该做些什么来在字典中为结果行中的所有列创建一个键值对吗?
class Project(db.Model):
__tablename__ = 'entries'
id = db.Column(db.Integer, primary_key=True)
time_start = db.Column(db.DateTime(timezone=False))
time_end = db.Column(db.DateTime(timezone=False))
name = db.Column(db.String(256), nullable=True)
analyst = db.Column(db.String(256), nullable=True)
def __init__(id, time_start, time_end, project_name, analyst):
self.id = id
self.time_start = time_start
self.time_end = time_end
self.name = name
self.analyst = analyst
latest_projects = db.session.query((func.max(Project.time_end)), Project.analyst).group_by(Project.analyst)
for row in latest_projects.all():
print (row._asdict())
{'analyst': 'Bob'}
{'analyst': 'Jane'}
{'analyst': 'Fred'}
我期待看到这样的结果......
{'analyst': 'Bob', 'time_end': '(2018, 11, 21, 14, 55)'}
{'analyst': 'Jane', 'time_end': '(2017, 10, 21, 08, 00)'}
{'analyst': 'Fred', 'time_end': '(2016, 09, 06, 01, 35)'}
解决方案
您尚未命名该func.max()
列,因此没有名称可用作结果字典中的键。聚合函数列不会自动命名,即使聚合单个列也是如此;您基于该列的该time_end
列在这里无关紧要。
给该列一个标签:
latest_projects = db.session.query(
func.max(Project.time_end).label('time_end'),
Project.analyst
).group_by(Project.analyst)
演示:
>>> latest_projects = db.session.query(
... func.max(Project.time_end).label('time_end'),
... Project.analyst
... ).group_by(Project.analyst)
>>> for row in latest_projects.all():
... print (row._asdict())
...
{'time_end': datetime.datetime(2018, 11, 21, 14, 55), 'analyst': 'Bob'}
{'time_end': datetime.datetime(2016, 9, 6, 1, 35), 'analyst': 'Fred'}
{'time_end': datetime.datetime(2017, 10, 21, 8, 0), 'analyst': 'Jane'}
推荐阅读
- mysql - 为什么mysql不接受阿姆哈拉语字符?
- cmake - 无法编译包含 tf2_ros 标头的 C++ 程序
- swiftui - 选择器在视图层次结构变暖中不可见
- google-chrome - Chrome 将我的搜索字段视为用户名字段
- python - AWS Lambda Python 3 处理 POST 文件
- c# - string[]a = Console.Readline() 是否与 string[]a = new string[] 相同?
- python - 使用 defaultdict 时出现键错误
- machine-learning - Coral 开发板上的 TensorFlow Lite 模型未在 TPU 上运行
- typescript - 需要 Typescript 接口、枚举、命名空间等的文档
- python - 将列表项转换为单个列表中的多个字典