Use SQLAlchemy fluently
Project description
Fluent Alchemy
輕鬆流暢地使用 SQLAclhemy
Installation
pip insall fluent-alchemy
Quick start
- 宣告 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())
- 建立 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)
- 開始使用 model 操作 database !
from models import User
users = User.all()
- 使用完畢後,釋放 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
-
Find by id
user = User.find(1)
-
只回傳特定欄位
user = User.select(User.id, User.name, User.email).first()
-
透過
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ffb786ef63d397c879675c3715a5c253a3ec549b14069585a7ca3fbfff029a9
|
|
| MD5 |
9883a1d4372a45cea28e084d94e2304c
|
|
| BLAKE2b-256 |
e7274bca5f51e6ccadbf686f02ce1814b52d2458548f366934c4ab61a755dd0e
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a70d3e0ca14696a36a40b17c62a3e7d8157bceb273c71bae4a959833ad383ff0
|
|
| MD5 |
13f0c909c7e0139ba1f602d59cafae4a
|
|
| BLAKE2b-256 |
0bb8dd775f5300af462bdf4b18a8c352e3e6e654ee2142d6308c163fd6183a35
|