Метод scalars класса AsyncConnection
Метод scalars класса AsyncConnection
выполняет SQL-запрос и возвращает объект
ScalarResult, который является асинхронным
итератором. В отличие от метода execute,
который возвращает строки целиком, метод
scalars извлекает только первый столбец
каждой строки. Это удобно, когда запрос
возвращает одно значение на строку. Первым
параметром метод принимает SQL-выражение,
вторым - необязательный словарь параметров.
Метод является асинхронным, поэтому вызывается
через await.
Синтаксис
await connection.scalars(statement, parameters)
Пример
Давайте создадим таблицу, заполним её и
извлечём столбец заголовков через метод
scalars:
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.begin() as conn:
await conn.execute(text(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title TEXT, '
'text TEXT, '
'status TEXT, '
'num INTEGER)'
))
await conn.execute(text(
"INSERT INTO articles (title, text, status, num) "
"VALUES ('article 1', 'text 1', 'draft', 10)"
))
await conn.execute(text(
"INSERT INTO articles (title, text, status, num) "
"VALUES ('article 2', 'text 2', 'published', 20)"
))
async with engine.connect() as conn:
res = await conn.scalars(text('SELECT title FROM articles'))
for title in res:
print(title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
article 1
article 2
Пример
Давайте передадим параметры в запрос через
второй аргумент метода scalars:
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.begin() as conn:
await conn.execute(text(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title TEXT, '
'text TEXT, '
'status TEXT, '
'num INTEGER)'
))
await conn.execute(text(
"INSERT INTO articles (title, text, status, num) "
"VALUES ('article 1', 'text 1', 'draft', 10)"
))
await conn.execute(text(
"INSERT INTO articles (title, text, status, num) "
"VALUES ('article 2', 'text 2', 'published', 20)"
))
async with engine.connect() as conn:
res = await conn.scalars(
text('SELECT title FROM articles WHERE status = :status'),
{'status': 'published'}
)
for title in res:
print(title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
article 2
Пример
Давайте извлечём числовой столбец и просуммируем полученные значения:
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.begin() as conn:
await conn.execute(text(
'CREATE TABLE articles ('
'id INTEGER PRIMARY KEY, '
'title TEXT, '
'text TEXT, '
'status TEXT, '
'num INTEGER)'
))
await conn.execute(text(
"INSERT INTO articles (title, text, status, num) "
"VALUES ('article 1', 'text 1', 'draft', 10)"
))
await conn.execute(text(
"INSERT INTO articles (title, text, status, num) "
"VALUES ('article 2', 'text 2', 'published', 20)"
))
async with engine.connect() as conn:
res = await conn.scalars(text('SELECT num FROM articles'))
total = sum(res)
print(total)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
30
Смотрите также
-
класс
AsyncConnection,
который представляет асинхронное соединение с базой -
метод
execute,
который выполняет запрос и возвращает строки целиком -
метод
scalar,
который возвращает одно скалярное значение -
метод
stream_scalars,
который возвращает асинхронный поток скалярных значений