【问题标题】:Why am I not getting results of SQL query back from using encode databases?为什么我没有从使用编码数据库得到 SQL 查询的结果?
【发布时间】:2021-05-16 06:58:02
【问题描述】:

我有以下内容,但由于某种原因,我没有得到我的查询结果,而是得到了其他东西

这是我正在使用的 Python 包

https://pypi.org/project/databases/

这是文档

https://www.encode.io/databases/database_queries/

from databases import Database
database=Database('postgres://redacted')
await database.connect()
...
...
...
query = "SELECT orders.id AS orders_id, orders.notification_method AS orders_notification_method WHERE shipped=True"
result = await database.fetch_all(query=query))

这是得到的,而不是得到我的查询结果

打印(结果)

[<databases.backends.postgres.Record object at 0x7fb3f415ac50>, <databases.backends.postgres.Record object at 0x7fb3f415ae30>, <databases.backends.postgres.Record object at 0x7fb3f415a470>, <databases.backends.postgres.Record object at 0x7fb3f415af50>, <databases.backends.postgres.Record object at 0x7fb3f415ad70>, <databases.backends.postgres.Record object at 0x7fb3f415ab30>, <databases.backends.postgres.Record object at 0x7fb3f415a7d0>, <databases.backends.postgres.Record object at 0x7fb3f415ae90>]

并且类型说它是一个列表

打印(类型(结果))

<class 'list'>

如何返回 SQL 查询的实际结果,即返回查询中的所有行?

我真正想做的事

这里是 sqlalchemy 版本,但使用 databases 包无法如上所述工作

我非常想要实现的是从 sqlalchemy 查询中获得类似的结果,如下所示,并且能够从查询结果中迭代行

...
...
...
class Orders:
    id: Optional[int]
    notification_method: str
    shipped: Optional[bool]

...
...
...
session = create_session()
result=session.query(Orders).filter(Orders.shipped == True)

打印(结果)

SELECT orders.id AS orders_id, orders.notification_method AS orders_notification_method FROM orders 
WHERE orders.shipped = true

打印(类型(结果))

<class 'sqlalchemy.orm.query.Query'>

然后我希望能够遍历行

for r in result:
    print(r)

输出

Orders(id=1, notification_method='call', shipped=True)
Orders(id=2, notification_method='sms', shipped=True)
Orders(id=3, notification_method='call', shipped=True)

只想获得与此 sqlalchmey 类似的结果,但使用本问题开头提到的databases

【问题讨论】:

  • 如果不是Record,“实际结果”是什么?如果我查看源代码,Record 将每一行的值封装在.values 属性中。你有什么问题?你也可能想做Query 而不是Raw Query
  • 我希望它返回我的查询结果......我的意思是代码显示了我想要的......我想打印 sql 查询的结果
  • 如何从 sql 查询中返回行?
  • 我用更多上下文更新了问题...有什么遗漏吗?

标签: python postgresql sqlalchemy python-asyncio fastapi


【解决方案1】:

databases.backends.postgres.Recordcollections.abc.Mapping 的子类。

它确实包含查询执行的结果(“实际结果”)。 为了“提取”这些值,您可以执行以下操作:

result = await database.fetch_all(query=query))
for rec in result:
    print(tuple(rec.values())  # or you could use `dict(rec.items())` as well

Edit-1:单个结果(来自评论)

如果您执行单个查询,您应该能够按以下方式打印/转换:

rec = await database.fetch_one(query=query)
print(rec)
print(tuple(rec.values()))
print(dict(rec.items()))

导致类似于:

<databases.backends.postgres.Record object at 0x??????>
(1, 'sms')
{'orders_id': 1, 'orders_notification_method': 'sms'}

【讨论】:

  • 如果有一个不同的查询返回单行并获取单行怎么办?像result = await database.fetch_one(query=query)) 我将如何获得单行结果的单字典?我尝试了dict(rec.items()) 并得到了AttributeError: 'str' object has no attribute 'items' 我如何为fetch_one 查询返回该单行的字典?
  • 我已经更新了答案,但是请仔细检查您的代码,单个查询应该也可以。
  • 另一个问题,因为您是唯一真正有帮助的人...当我将async 添加到任务功能时,芹菜不起作用...那么如何将编码数据库包与芹菜一起使用?似乎数据库只是异步查询数据库,每个查询都使用await 运行,而 celery 不使用async def function():...必须是def function():...再次感谢您的帮助..谢谢
  • 对不起,我不使用芹菜。但是这个question/answer 很可能会对你有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2019-02-27
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多