Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: SQLAlchemyInitPlugin to SQLAlchemyPlugin fixes SerializationException for docs #3475

Merged
merged 19 commits into from
May 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
fc5f18d
Update sqlalchemy_declarative_models.py
JorenSix May 6, 2024
3fd090d
Merge pull request #1 from GhentCDH/SQLAlchemyInitPlugin-fix
JorenSix May 6, 2024
68b845a
Update sqlalchemy_declarative_models.py
JorenSix May 6, 2024
5cfca23
Update docs/examples/contrib/sqlalchemy/sqlalchemy_declarative_models.py
JorenSix May 13, 2024
7878916
Update docs/examples/contrib/sqlalchemy/sqlalchemy_declarative_models.py
JorenSix May 13, 2024
a38d22e
Update docs/examples/contrib/sqlalchemy/sqlalchemy_declarative_models.py
JorenSix May 13, 2024
77f7338
Update docs/examples/contrib/sqlalchemy/sqlalchemy_declarative_models.py
JorenSix May 13, 2024
38cb341
Update docs/examples/contrib/sqlalchemy/sqlalchemy_declarative_models.py
JorenSix May 13, 2024
2869a57
Merge branch 'main' into main
JorenSix May 13, 2024
f4a35ab
Unit test for sqlalchemy_declarative_models.
JorenSix May 13, 2024
0a71d74
Now using option create_all=True for meta-data, on_startup for dummy …
JorenSix May 13, 2024
a394ed4
Lint ruff-format compatibility
JorenSix May 13, 2024
69f6469
Fix for 3.9 and 3.10 wrt class declarations/typing
JorenSix May 13, 2024
f357cdb
Ruff format check
JorenSix May 13, 2024
2956762
Removed comments which might be heavy for example code
JorenSix May 13, 2024
620f5db
Merge branch 'main' into main
JorenSix May 15, 2024
4f26775
Merge branch 'main' into main
JorenSix May 16, 2024
8044f6b
For 3.8 compatibility wrt typing now using List in stead of list
JorenSix May 16, 2024
c42ed7e
Replaced incorrect use of List instead of List
JorenSix May 16, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
35 changes: 21 additions & 14 deletions docs/examples/contrib/sqlalchemy/sqlalchemy_declarative_models.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
from __future__ import annotations

import uuid
from datetime import date
from typing import TYPE_CHECKING
from typing import List
from uuid import UUID

from sqlalchemy import ForeignKey, select
from sqlalchemy import ForeignKey, func, select
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession
from sqlalchemy.orm import Mapped, mapped_column, relationship

from litestar import Litestar, get
from litestar.contrib.sqlalchemy.base import UUIDAuditBase, UUIDBase
from litestar.contrib.sqlalchemy.plugins import AsyncSessionConfig, SQLAlchemyAsyncConfig, SQLAlchemyInitPlugin

if TYPE_CHECKING:
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession
from litestar.contrib.sqlalchemy.plugins import AsyncSessionConfig, SQLAlchemyAsyncConfig, SQLAlchemyPlugin


# the SQLAlchemy base includes a declarative model for you to use in your models.
# The `Base` class includes a `UUID` based primary key (`id`)
class Author(UUIDBase):
name: Mapped[str]
dob: Mapped[date]
books: Mapped[list["Book"]] = relationship(back_populates="author", lazy="selectin")
books: Mapped[List[Book]] = relationship(back_populates="author", lazy="selectin")


# The `AuditBase` class includes the same UUID` based primary key (`id`) and 2
Expand All @@ -32,25 +33,31 @@ class Book(UUIDAuditBase):

session_config = AsyncSessionConfig(expire_on_commit=False)
sqlalchemy_config = SQLAlchemyAsyncConfig(
connection_string="sqlite+aiosqlite:///test.sqlite", session_config=session_config
connection_string="sqlite+aiosqlite:///test.sqlite", session_config=session_config, create_all=True
) # Create 'async_session' dependency.
sqlalchemy_plugin = SQLAlchemyInitPlugin(config=sqlalchemy_config)


async def on_startup() -> None:
JorenSix marked this conversation as resolved.
Show resolved Hide resolved
"""Initializes the database."""
async with sqlalchemy_config.get_engine().begin() as conn:
await conn.run_sync(UUIDBase.metadata.create_all)
"""Adds some dummy data if no data is present."""
async with sqlalchemy_config.get_session() as session:
statement = select(func.count()).select_from(Author)
count = await session.execute(statement)
if not count.scalar():
author_id = uuid.uuid4()
session.add(Author(name="Stephen King", dob=date(1954, 9, 21), id=author_id))
session.add(Book(title="It", author_id=author_id))
await session.commit()


@get(path="/authors")
async def get_authors(db_session: "AsyncSession", db_engine: "AsyncEngine") -> list[Author]:
async def get_authors(db_session: AsyncSession, db_engine: AsyncEngine) -> List[Author]:
"""Interact with SQLAlchemy engine and session."""
return list(await db_session.scalars(select(Author)))


app = Litestar(
route_handlers=[get_authors],
on_startup=[on_startup],
JorenSix marked this conversation as resolved.
Show resolved Hide resolved
JorenSix marked this conversation as resolved.
Show resolved Hide resolved
plugins=[SQLAlchemyInitPlugin(config=sqlalchemy_config)],
debug=True,
plugins=[SQLAlchemyPlugin(config=sqlalchemy_config)],
)
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ known-first-party = ["litestar", "tests", "examples"]
"docs/examples/application_hooks/before_send_hook.py" = ["UP006"]
"docs/examples/contrib/sqlalchemy/plugins/**/*.*" = ["UP006"]
"docs/examples/data_transfer_objects**/*.*" = ["UP006"]
"docs/examples/contrib/sqlalchemy/sqlalchemy_declarative_models.py" = ["UP006"]
"litestar/_openapi/schema_generation/schema.py" = ["C901"]
"litestar/exceptions/*.*" = ["N818"]
"litestar/handlers/**/*.*" = ["N801"]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import pytest

from litestar.testing import TestClient

pytestmark = pytest.mark.xdist_group("sqlalchemy_examples")


def test_sqlalchemy_declarative_models() -> None:
from docs.examples.contrib.sqlalchemy.sqlalchemy_declarative_models import app

with TestClient(app) as client:
response = client.get("/authors")
assert response.status_code == 200
assert len(response.json()) > 0