Async usage¶
If your application uses an AsyncSession
instead of a synchronous Session, use the async seeders. AsyncSeeder
and AsyncHybridSeeder mirror Seeder and
HybridSeeder: they accept the same entities and
expose the same instances property, but their seed method is awaitable.
Under the hood they run the existing synchronous seeding logic through
run_sync(), so a filter key still
issues a real query –
executed against your async driver – during the seed traversal.
Installation¶
Install the async extra (which pulls in greenlet, required by SQLAlchemy’s
asyncio support) together with an async driver such as aiosqlite or
asyncpg:
pip install "sqlalchemyseed[async]" aiosqlite
AsyncSeeder¶
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemyseed import AsyncSeeder
engine = create_async_engine("sqlite+aiosqlite:///app.db")
data = {
"model": "models.Company",
"data": {
"name": "MyCompany",
"!employees": [
{"data": {"name": "Alice"}},
{"data": {"name": "Bob"}},
],
},
}
async with AsyncSession(engine) as session:
seeder = AsyncSeeder(session, ref_prefix="!")
await seeder.seed(data)
await session.commit()
AsyncHybridSeeder¶
Use AsyncHybridSeeder when the entities contain a filter key, just as
you would reach for HybridSeeder in synchronous
code.
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemyseed import AsyncHybridSeeder
data = {
"model": "models.Employee",
"data": {
"name": "Carol",
"!company": { # references an existing row
"model": "models.Company",
"filter": {"name": "Acme"},
},
},
}
async with AsyncSession(engine) as session:
seeder = AsyncHybridSeeder(session)
await seeder.seed(data)
await session.commit()
Note
The async seeders are only importable when SQLAlchemy’s asyncio support
(greenlet) is installed. Without it, the rest of sqlalchemyseed still
imports normally – only AsyncSeeder and AsyncHybridSeeder are
unavailable.