Метод raw_connection
Метод raw_connection класса AsyncEngine возвращает
низкоуровневое соединение с базой данных из пула соединений.
Метод является асинхронным, поэтому его следует вызывать
через await. Параметров метод не принимает.
Полученное соединение относится к драйверу СУБД и предоставляет
доступ к его «сырому» API, минуя высокоуровневые абстракции
SQLAlchemy.
Возвращаемый объект зависит от используемого диалекта.
Для SQLite с драйвером aiosqlite это
AsyncAdapt_aiosqlite_connection, для PostgreSQL
с asyncpg - обертка над соединением asyncpg.
Закрывать такое соединение нужно методом close,
чтобы вернуть его обратно в пул.
Синтаксис
await engine.raw_connection()
Пример
Давайте получим низкоуровневое соединение и выведем его тип:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
conn = await engine.raw_connection()
print(type(conn))
await conn.close()
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"<class 'sqlalchemy.dialects.sqlite.aiosqlite.AsyncAdapt_aiosqlite_connection'>"
Пример
Давайте выполним SQL-запрос напрямую через курсор низкоуровневого соединения:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
conn = await engine.raw_connection()
cursor = await conn.cursor()
await cursor.execute('CREATE TABLE articles (id INTEGER, title TEXT)')
await cursor.execute("INSERT INTO articles VALUES (1, 'article')")
await cursor.execute('SELECT title FROM articles')
res = await cursor.fetchall()
print(res)
await cursor.close()
await conn.close()
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[('article',)]
Пример
Давайте сравним объект, возвращаемый методом raw_connection,
с обычным соединением из метода connect:
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.connect() as conn:
print(type(conn))
raw = await engine.raw_connection()
print(type(raw))
await raw.close()
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"<class 'sqlalchemy.ext.asyncio.engine.AsyncConnection'>"
"<class 'sqlalchemy.dialects.sqlite.aiosqlite.AsyncAdapt_aiosqlite_connection'>"
Смотрите также
-
класс
AsyncEngine,
который представляет асинхронный движок базы данных -
метод
connect,
который открывает высокоуровневое асинхронное соединение -
метод
begin,
который открывает соединение и начинает транзакцию -
атрибут
sync_engine,
который возвращает синхронный движок под асинхронным