У меня был класс PGServer, который можно было перебирать, чтобы получить список имен баз данных:
Код: Выделить всё
class PGServer:
# ...connection code omitted...
def _databases( self ):
curr = self.connection().cursor()
curr.execute( "SELECT datname FROM pg_database ORDER BY datname" )
return [ row[ 0 ] for row in curr.fetchall() ]
def __iter__( self ):
return iter( self._databases() )
dbs = PGServer( ...connection params... )
for db in dbs:
print( db )
Код: Выделить всё
class PGServer:
# ...connection code omitted...
async def _databases( self ):
conn = await self.connection()
rows = await conn.fetch( "SELECT datname FROM pg_database ORDER BY datname" )
return [ row[ 0 ] for row in rows ]
dbs = PGServer( ...connection params... )
for db in await dbs._databases():
print( db )
Некоторые реализации, которые я пробовал:
Код: Выделить всё
async def __aiter__( self ):
#return self._databases()
#return await self._databases()
#return aiter( self._databases() )
return aiter( await self._databases() )
Код: Выделить всё
TypeError: 'async for' received an object from __aiter__ that does not implement __anext__: coroutine
Я только что создал реализацию, которая, похоже, работает:
Код: Выделить всё
async def __aiter__( self ):
for db in await self._databases():
yield name
ОБНОВЛЕНИЕ 2
Если только кто-то может придумать что-то получше, я просто откажусь от __iter__ и скажу, что db in dbs:, и вместо этого просто буду более явным:
Код: Выделить всё
for db in await dbs.databases():
...
Подробнее здесь: https://stackoverflow.com/questions/790 ... ter-method