Skip to content

Query Expressions

The expression facade lowers Python column expressions into the Rust query compiler.

"""Query expression example."""

import asyncio

from pydantic import BaseModel

from ormdantic import Ormdantic, column

db = Ormdantic("sqlite:///examples_query_expressions.sqlite3")


@db.table(pk="id")
class Flavor(BaseModel):
    id: str
    name: str
    strength: int | None = None


async def main() -> None:
    await db.init()
    await db.drop_all()
    await db.create_all()

    await db[Flavor].insert(Flavor(id="1", name="mocha", strength=5))
    await db[Flavor].insert(Flavor(id="2", name="latte", strength=None))

    strong = await db[Flavor].find_many(
        where=(column("strength") >= 5) & column("name").like("mo%")
    )
    assert [flavor.name for flavor in strong.data] == ["mocha"]

    flexible = await db[Flavor].find_many(
        where=column("name").ilike("MO%") | column("strength").is_(None)
    )
    assert {flavor.name for flavor in flexible.data} == {"mocha", "latte"}


if __name__ == "__main__":
    asyncio.run(main())