Skip to main content

Use SQLAlchemy fluently

Project description

Fluent Alchemy

輕鬆流暢地使用 SQLAclhemy

Installation

pip insall fluent-alchemy

Quick start

  1. 宣告 Models 並繼承 ActiveRecord
# models.py
from sqlalchemy.orm import DeclarativeBase
from fluent_alchemy import ActiveRecord

class Base(DeclarativeBase, ActiveRecord):
    pass

class User(Base):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(BigInteger(), primary_key=True)
    email: Mapped[str] = mapped_column(String(), unique=True)
    password: Mapped[str] = mapped_column(String())
    name: Mapped[str] = mapped_column(String(50))
    state: Mapped[bool] = mapped_column(Boolean())
  1. 建立 SQLAclhemy Engine, 並指派給 ActiveRecord 內的 session handler
from sqlalchemy import create_engine
from models import Base

engine = create_engine("sqlite://:memory:", echo=True)

Base.set_engine(engine)
  1. 開始使用 model 操作 database !
from models import User

users = User.all()
  1. 使用完畢後,釋放 Session 資源
from models import Base

Base.remove_scoped_session()

Features

Active Record

利用 QueryBuilder 來處理 SQLAlchemy 的 select() query statement

  • Create

    from models import User
    
    user = User.create(
        name="Justin",
        email="corey97@example.org",
        password="NioWe9Wn#+"
    )
    
    # or
    
    user = User(
        name="Justin",
        email="corey97@example.org",
        password="NioWe9Wn#+"
    )
    user.save()
    
  • Read

    1. Find by id

      user = User.find(1)
      
    2. 只回傳特定欄位

      user = User.select(User.id, User.name, User.email).first()
      
    3. 透過 where 增加查詢條件

      user = User.where(User.email == "corey97@example.org").first()
      
      users = User.where(User.state.is_(True)).get()
      
  • Update

    user = User.find(1)
    user.passwod = "6xjVAY$p&D"
    
    user.save()
    
  • Delete

    user = User.find(1)
    user.delete()
    
  • Pagenate

    # setting page number and rows count per page
    pagination = User.paginate(page=1, per_page=15)
    
    """
    {
        "total": 100,
        "per_page": 15,
        "current_page": 1,
        "last_page": 7,
        "data": [ ... ], # ussers
    }
    """
    

Mixins

TimestampMixin

讓指定的 Model class 繼承 TimestampMixin,讓該 Model 補上 created_at, updated_at 欄位。

from fluent_alchemy import ActiveRecord, TimestampMixin

class Base(DeclarativeBase, ActiveRecord):
    pass

class User(Base, TimestampMixin):
    __tablename__ = "users"
    ...

###
user = User.find(1)

print(user.created_at)
print(user.updated_at)

SoftDeleteMixin

讓指定的 Model class 繼承 SoftDeleteMixin,就可以讓該 Model 擁有 Soft delete 的能力。

from sqlalchemy.orm import DeclarativeBase
from fluent_alchemy import ActiveRecord, SoftDeleteMixin

class Base(DeclarativeBase, ActiveRecord):
    pass

class User(Base, SoftDeleteMixin):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(BigInteger(), primary_key=True)
    email: Mapped[str] = mapped_column(String(), unique=True)
    password: Mapped[str] = mapped_column(String())
    name: Mapped[str] = mapped_column(String(50))
    state: Mapped[bool] = mapped_column(Boolean())

SoftDeleteMixin 會自動補上 deleted_at 欄位,依此欄位來處理 soft delete 的資料。

deleted_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP(), nullable=True)

設定完成後,之後對此 Model 進行 Query 時,會在 statement 內的 WHERE 條件自動加上 deleted_at IS NULL

查詢已被標記刪除的資料

users_deleted = User.where(...).get(with_trashed=True)

強制刪除 (Force delete)

user = User.find(1)

user.delete(force=True)

Examples

在 FastAPI 內使用

from contextlib import asynccontextmanager
from fastapi import FastAPI, Depends
from app.models import BaseModel, User

def close_scoped_session():
    """
    Remove the scoped session at the enf of every request.
    """
    yield
    BaseModel.remove_scoped_session()

@asynccontextmanager
async def lifespan(app: FastAPI):
    """
    Set engine to the ScopedSessionHandler when FastAPI app started.
    """
    BaseModel.set_engine(engine)
    yield

app = FastAPI(
    title="MyApp",
    dependencies=[Depends(close_scoped_session)],
    lifespan=lifespan
)

@app.get("/users")
def index():
    return User.all()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fluent_alchemy-0.0.2.tar.gz (8.4 kB view details)

Uploaded Source

Built Distribution

fluent_alchemy-0.0.2-py3-none-any.whl (10.4 kB view details)

Uploaded Python 3

File details

Details for the file fluent_alchemy-0.0.2.tar.gz.

File metadata

  • Download URL: fluent_alchemy-0.0.2.tar.gz
  • Upload date:
  • Size: 8.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.10.11 Darwin/23.2.0

File hashes

Hashes for fluent_alchemy-0.0.2.tar.gz
Algorithm Hash digest
SHA256 9ffb786ef63d397c879675c3715a5c253a3ec549b14069585a7ca3fbfff029a9
MD5 9883a1d4372a45cea28e084d94e2304c
BLAKE2b-256 e7274bca5f51e6ccadbf686f02ce1814b52d2458548f366934c4ab61a755dd0e

See more details on using hashes here.

File details

Details for the file fluent_alchemy-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: fluent_alchemy-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 10.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.10.11 Darwin/23.2.0

File hashes

Hashes for fluent_alchemy-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a70d3e0ca14696a36a40b17c62a3e7d8157bceb273c71bae4a959833ad383ff0
MD5 13f0c909c7e0139ba1f602d59cafae4a
BLAKE2b-256 0bb8dd775f5300af462bdf4b18a8c352e3e6e654ee2142d6308c163fd6183a35

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page