muffin-peewee-aio — Asynchronous Peewee ORM integration for the Muffin framework.
- Python >= 3.10
Install via pip:
$ pip install muffin-peewee-aioYou can include an async database driver as needed:
$ pip install muffin-peewee-aio[aiosqlite]
$ pip install muffin-peewee-aio[aiopg]
$ pip install muffin-peewee-aio[asyncpg]
$ pip install muffin-peewee-aio[aiomysql]from muffin import Application
from muffin_peewee import Plugin as Peewee
# Create the application
app = Application("example")
# Initialize the plugin
db = Peewee()
db.setup(app, PEEWEE_CONNECTION="postgresql://postgres:postgres@localhost:5432/database")
# Or: db = Peewee(app, **options)You can provide options either at initialization or through the application config.
| Name | Default | Description |
|---|---|---|
| CONNECTION | sqlite:///db.sqlite |
Database connection URL |
| CONNECTION_PARAMS | {} |
Extra options passed to the database backend |
| REPLICAS | None |
List of read-replica connection URLs |
| AUTO_CONNECTION | True |
Automatically acquire a DB connection per request |
| AUTO_TRANSACTION | True |
Automatically wrap each request in a transaction |
| MIGRATIONS_ENABLED | True |
Enable the migration engine |
| MIGRATIONS_PATH | "migrations" |
Path to store migration files |
| PYTEST_SETUP_DB | True |
Manage DB setup and teardown in pytest |
You can also define options in the Application config using the PEEWEE_ prefix:
PEEWEE_CONNECTION = "postgresql://..."Note: Muffin application config is case-insensitive.
Define your model:
class Test(db.Model):
data = peewee.CharField()Query the database:
@app.route("/")
async def view(request):
return [t.data async for t in Test.select()]By default, connections and transactions are managed automatically. To manage them manually, disable the config flags and use context managers:
@app.route("/")
async def view(request):
async with db.connection():
async with db.transaction():
# Perform DB operations here
...You can configure read replicas via the REPLICAS option:
db.setup(
app,
PEEWEE_CONNECTION="postgresql://...",
PEEWEE_REPLICAS=[
"postgresql://replica1/...",
"postgresql://replica2/...",
],
)Use db.replica() to open a read-only connection to a replica backend:
@app.route("/")
async def view(request):
async with db.replica():
return [t.data async for t in Test.select()]Create a migration:
$ muffin example:app peewee-create [NAME] [--auto]Run migrations:
$ muffin example:app peewee-migrate [NAME] [--fake]Rollback the latest migration:
$ muffin example:app peewee-rollbackList all migrations:
$ muffin example:app peewee-listClear migration history from the database:
$ muffin example:app peewee-clearMerge all migrations into one:
$ muffin example:app peewee-mergeYou can use the conftest() context manager to auto-manage schema setup and teardown during testing:
import pytest
@pytest.mark.asyncio
async def test_example():
async with db.conftest():
# Tables are created and dropped automatically
...Found a bug or have a suggestion? Please open an issue at: https://github.com/klen/muffin-peewee-aio/issues
Development takes place at: https://github.com/klen/muffin-peewee-aio Pull requests are welcome!
- klen (Kirill Klenov)
This project is licensed under the MIT license.