首页 > 解决方案 > 如何使用 python asyncio mongo 客户端电机列出数据库?

问题描述

我在使用asyncio列出数据库时遇到问题。

以下代码:

import asyncio
import motor.motor_asyncio
import sys

async def list():
    print(sys.version)
    print(motor.version)
    client = motor.motor_asyncio.AsyncIOMotorClient("mongodb://admin:password@mongo/")
    for db in client.list_databases():
        print(db)
        print(type(db))
        await db


loop = asyncio.get_event_loop()
loop.run_until_complete(list())

失败并出现以下错误

2.1.0
3.8.5 (default, Jul 21 2020, 10:48:26) 
[Clang 11.0.3 (clang-1103.0.32.62)]
<Future pending cb=[run_on_executor.<locals>._call_check_cancel() at /usr/local/lib/python3.8/site-packages/motor/frameworks/asyncio/__init__.py:80]>
<class '_asyncio.Future'>
Traceback (most recent call last):
  File "test.py", line 17, in <module>
    loop.run_until_complete(list())
  File "/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "test.py", line 13, in list
    await db
RuntimeError: await wasn't used with future

我发现这个问题似乎与https://bugs.python.org/issue37172相关。这似乎在 python 3.7.7 和电机 2.0.0 上也失败了。

作为目前一项可怕的工作,我pymongo专门用于此操作 - 但我不希望这样做。

标签: pythonmongodbpython-asyncio

解决方案


要列出所有数据库的名称,可以使用list_database_names

client = motor.motor_asyncio.AsyncIOMotorClient()
dbs = await client.list_database_names()
print(dbs)  # ["admin", "config", "local", "..."]

将光标移到数据库上,您需要使用list_databases

client = motor.motor_asyncio.AsyncIOMotorClient()
cursor = await client.list_databases()
try:
    while True:
        db = await cursor.next()
        print(db)  # {'name': 'admin', 'sizeOnDisk': 40960, 'empty': False}, ...
except StopAsyncIteration:
    pass

list_databases您还可以使用listDatabases命令


推荐阅读