Метод run_sync
Метод run_sync класса AsyncConnection
позволяет выполнить синхронную функцию,
принимающую в качестве аргумента объект
Connection, внутри асинхронного
соединения. Первым параметром метод принимает
синхронную функцию, которая будет вызвана
с объектом соединения. Это особенно полезно
для вызова функций и методов SQLAlchemy,
которые еще не имеют асинхронных аналогов,
например, для работы с метаданными или
инспекцией базы данных.
Синтаксис
await conn.run_sync(fn, *arg, **kw)
Пример
Давайте создадим асинхронный движок и выполним синхронную функцию, которая выводит тип соединения:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
def sync_function(conn):
print(type(conn).__name__)
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
await conn.run_sync(sync_function)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"Connection"
Пример
Давайте используем run_sync для
создания таблиц через объект MetaData:
import asyncio
from sqlalchemy import Table, Column, Integer, String, MetaData
from sqlalchemy.ext.asyncio import create_async_engine
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String)
)
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(metadata.create_all)
async with engine.connect() as conn:
res = await conn.run_sync(
lambda sync_conn: sync_conn.execute(
articles.select()
).fetchall()
)
print(res)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[]
Пример
Давайте выполним синхронную вставку данных и проверим результат:
import asyncio
from sqlalchemy import Table, Column, Integer, String, MetaData, insert, select
from sqlalchemy.ext.asyncio import create_async_engine
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String)
)
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(metadata.create_all)
await conn.run_sync(
lambda sync_conn: sync_conn.execute(
insert(articles).values(title='article')
)
)
async with engine.connect() as conn:
res = await conn.run_sync(
lambda sync_conn: sync_conn.execute(
select(articles.c.title)
).fetchall()
)
print(res)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[('article',)]
Смотрите также
-
класс
AsyncConnection,
который представляет асинхронное соединение -
метод
execute,
который выполняет SQL-запрос асинхронно -
метод
begin,
который начинает транзакцию -
метод
exec_driver_sql,
который выполняет SQL-запрос напрямую