Метод stream_scalars класса AsyncConnection
Метод stream_scalars класса AsyncConnection
выполняет SQL-запрос и возвращает асинхронный
итератор скалярных значений. В отличие от метода
scalars, который загружает все строки сразу,
метод stream_scalars отдаёт результаты
по мере их поступления, что экономит память
при работе с большими выборками.
Первым параметром передаётся SQL-выражение
или текст запроса, дополнительно можно передать
параметры через params и настройки выполнения
через execution_options.
Синтаксис
await connection.stream_scalars(statement, [params], [execution_options])
Пример
Давайте создадим таблицу и получим скалярные значения столбца через асинхронный поток:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
await conn.execute(text(
'CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'
))
await conn.execute(text(
"INSERT INTO articles (title) VALUES ('article 1'), ('article 2'), ('article 3')"
))
await conn.commit()
res = await conn.stream_scalars(text('SELECT title FROM articles'))
async for title in res:
print(title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
article 1
article 2
article 3
Пример
Давайте передадим параметры в запрос через
аргумент params:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
await conn.execute(text(
'CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'
))
await conn.execute(text(
"INSERT INTO articles (title) VALUES ('article 1'), ('article 2'), ('article 3')"
))
await conn.commit()
res = await conn.stream_scalars(
text('SELECT title FROM articles WHERE id > :min_id'),
{'min_id': 1}
)
async for title in res:
print(title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
article 2
article 3
Пример
Давайте получим первое значение из потока
через метод first:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
await conn.execute(text(
'CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'
))
await conn.execute(text(
"INSERT INTO articles (title) VALUES ('article 1'), ('article 2'), ('article 3')"
))
await conn.commit()
res = await conn.stream_scalars(text('SELECT title FROM articles ORDER BY id'))
print(await res.first())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"article 1"
Пример
Давайте соберём все значения потока в список
через метод all:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
await conn.execute(text(
'CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'
))
await conn.execute(text(
"INSERT INTO articles (title) VALUES ('article 1'), ('article 2'), ('article 3')"
))
await conn.commit()
res = await conn.stream_scalars(text('SELECT title FROM articles ORDER BY id'))
print(await res.all())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
['article 1', 'article 2', 'article 3']
Смотрите также
-
класс
AsyncConnection,
который представляет асинхронное соединение с базой данных -
метод
stream,
который возвращает асинхронный поток строк -
метод
scalars,
который загружает все скалярные значения сразу -
метод
execute,
который выполняет SQL-запрос на соединении