EncodeDB¶
Encode Database is a database that gives you simple asyncio support for a
range of databases.
It allows you to make queries using the powerful SQLAlchemy Core expression
language and provides support for PostgreSQL, MySQL, and SQLite.
Databases is suitable for integrating against any async Web framework, such as
Starlette, Sanic, Responder, Quart, aiohttp, Tornado, or FastAPI.
You could check the documentation for more information.
- 
Check that you install requirements 
- 
Setup the database, and we will use the EncodeDBBackendas a dependency.
import databases
from authx import Authentication, EncodeDBBackend
auth = Authentication(
    backend=EncodeDBBackend(
        database=databases(
            host="localhost",
            port=5432,
            user="postgres",
            password="postgres",
            database="authx",
        ),
    )
)
Here we present a simple PostgreSQL database example on how to use the
EncodeDBBackend.
Create/Update/Delete Functions¶
Here we are creating the functions that will be used to create and update the database,based on the request.
- Create:
async def create(self, obj: dict) -> UUID:
    uuid = uuid4()
    obj[id] = uuid
    query = self.users.insert()
    await self.database.execute(query=query, values=obj)
    return uuid
- Update:
 async def update(self, id: UUID, obj: dict) -> bool:
    obj.pop("id", None)
    query = (
        sa.update(self.users)
        .where(self.users.c.id == id)
        .values(obj)
        .returning(self.users.c.id)
    )
    res = await self.database.execute(query)
    return bool(res)
- Delete:
async def delete(self, id: UUID) -> bool:
    query = (
        sa.delete(self.users)
        .where(self.users.c.id == id)
        .returning(self.users.c.id)
    )
    res = await self.database.execute(query)
    return bool(res)
Complex Functions¶
After you have created the database, you can use the following functions to create, update, and delete users.
- request Email Confirmation:
async def request_email_confirmation(self, email: str, token_hash: str) -> None:
    query = (
        pg_insert(self.email_confirmations)
        .values(email=email, token=token_hash)
        .on_conflict_do_update(constraint="email", set_={"token": token_hash})
    )
    await self.database.execute(query)
    return None
- Confirm Email:
async def confirm_email(self, token_hash: str) -> bool:
    query = sa.select(self.email_confirmations).where(
        self.email_confirmations.c.token == token_hash
    )
    email_confirmation = await self.database.fetch_one(query)
    if email_confirmation:
        email = email_confirmation["email"]
        async with self.database.transaction():
            query = (
                sa.update(self.users)
                .where(self.users.c.email == email)
                .values(confirmed=True)
            )
            await self.database.execute(query)
            query = sa.delete(self.email_confirmations).where(
                self.email_confirmations.c.email == email
            )
            await self.database.execute(query)
        return True
    else:
        return False
Here we Present different functions to create, update, and delete users, also some complex functions to use it if you would like to extend the functionality.