python - 在 Pyramid 中创建 sqlalchemy 查询对象的字典

标签 python sqlalchemy pyramid

我是 Python 和 Pyramid 的新手。在我用来了解 Pyramid 的更多信息的测试应用程序中,我想查询数据库并根据 sqlalchemy 查询对象的结果创建字典,最后将字典发送到变色龙模板。

到目前为止,我有以下代码(工作正常),但我想知道是否有更好的方法来创建我的字典。

...
index = 0
clients = {}
q = self.request.params['q']
for client in DBSession.query(Client).filter(Client.name.like('%%%s%%' % q)).all():
    clients[index] = { "id": client.id, "name": client.name }
    index += 1
output = { "clients": clients }

return output

在学习 Python 时,我发现了一种在 for 循环语句中创建列表的好方法,如下所示:

myvar = [user.name for user in users]

那么,我的另一个问题是:是否有类似上述的“一行”方式来创建 sqlalchemy 查询对象的字典?

提前致谢。

最佳答案

嗯,是的,我们可以收紧一点。

首先,这个模式:

 index = 0
 for item in seq:
     frobnicate(index, item)
     item += 1

很常见,有一个内置函数可以自动执行此操作,enumerate(),用法如下:

 for index, item in enumerate(seq):
     frobnicate(index, item)

但是,我不确定你是否需要它,将事物与从零开始的整数索引相关联是列表的功能,你真的不需要字典;除非你想有漏洞,或者需要字典的一些其他特殊功能,否则就这样做:

 stuff = []
 stuff.extend(seq)

当您只对数据库实体的一小部分属性感兴趣时,最好告诉 sqlalchemy 发出仅返回该属性的查询:

 query = DBSession.query(Client.id, Client.name) \
                  .filter(q in Client.name)

在上面我也将 .name.like('%%%s%%' % q) 缩短为 q in name 因为它们的意思同样的事情(sqlalchemy 将它扩展为正确的 LIKE 表达式)

以这种方式构造的查询返回 special thing它看起来像一个元组,可以通过对其调用 _asdict() 轻松地变成字典:

所以把它们放在一起

output = [row._asdict() for row in DBSession.query(Client.id, Client.name)
                                            .filter(q in Client.name)]

或者,如果你真的迫切需要它成为一个字典,你可以使用一个字典理解:

output = {index: row._asdict() 
          for index, row 
          in enumerate(DBSession.query(Client.id, Client.name)
                                .filter(q in Client.name))}

关于python - 在 Pyramid 中创建 sqlalchemy 查询对象的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17704232/

相关文章:

python - 使用 Python 使用来自 Azure 事件中心的消息?

python - Python matplotlib 作为 cron 作业运行时出现 QxcbConnection 错误

python - 如何从 Vim 在 shell 中加载 python,但不立即使用它?

python - 由于 DBSession.add(),SQLAlchemy 抛出 IntegrityError

python - 如何刷新 Pyramid 中 Beaker 缓存中的所有区域?

jquery - 使用 Pyramid 处理 ajax 文件上传服务器端

python - 为什么这两种代码在 Python 和 Cython 中存在巨大的性能差异?

python - 如何从geoalchemy2的查询结果中获取lng lat值

python - 从日期时间中选择时间

Python Pyramid 学习资源