Classe de base ORM légère pour SQLite
Project description
sqlite-persistence
Classe de base ORM légère pour SQLite, sans dépendances externes.
Installation
# depuis un dépôt git
uv add git+https://codeberg.org/styfore/sqlite-persist.git
# ou en local
uv add sqlite-persist
Mise en place
from sqlite_persistence import Persistence
import sqlite3
con = sqlite3.connect("ma_base.db")
class User(Persistence):
def __init__(self, id: int | None, username: str, email: str, age: int):
self.id = id
self.username = username
self.email = email
self.age = age
Lecture
# Par PK — lève KeyError si introuvable
user = User.get(1, con=con)
# Par PK — retourne None si introuvable
user = User.find(1, con=con)
# Sélection avec filtres
users = User.select(con=con) # SELECT *
users = User.select({"username": "alice"}, con=con) # opérateur = par défaut
users = User.select({"username LIKE": "ali%"}, con=con) # opérateur custom
users = User.select({"age >=": 18, "age <": 30}, con=con) # même colonne, deux opérateurs
users = User.select({"username": "alice"}, order_by="age", con=con)
users = User.select({"username": "alice"}, order_by=["age", "email DESC"], con=con)
# Requête libre (JOIN, sous-requêtes, etc.)
users = User.select(
"username LIKE :q OR email LIKE :q",
params={"q": "%alice%"},
con=con,
)
# Requête SQL complète
users = User.from_query("""
SELECT u.*, COUNT(o.id) as nb_orders
FROM user u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id
HAVING nb_orders > :min
""", params={"min": 2}, con=con)
# Les colonnes extra (nb_orders) sont accessibles dans __dict__, attention un update après levera une erreur, ou nommer la colonne supplémentaire en commençant par _
Écriture
# Insert — met à jour self.id avec la valeur générée par SQLite
user = User(None, "alice", "alice@example.com", 30)
user.insert(con=con)
print(user.id) # id généré
# Update strict — la ligne doit exister
user.age = 31
user.update(con=con)
# Upsert — INSERT OR REPLACE, gère les deux cas
user.upsert(con=con)
# Delete
user.delete(con=con)
Opérations batch
users = [
User(None, "alice", "alice@example.com", 30),
User(None, "bob", "bob@example.com", 25),
]
User.insert_all(users, con=con) # ids mis à jour sur chaque item
User.update_all(users, con=con)
User.upsert_all(users, con=con)
User.delete_all(users, con=con)
# Sans instances
User.update_where(values={"age": 0}, where={"username": "bob"}, con=con)
User.delete_where({"username": "bob"}, con=con)
Injection automatique de connexion (ex. Flask)
Surcharger _con() dans une classe intermédiaire — plus besoin de passer con= partout :
from sqlite_persistence import Persistence
from mon_app.db import get_db
class AppPersistence(Persistence):
@classmethod
def _con(cls):
return get_db()
class User(AppPersistence):
...
user = User.get(1) # con= injecté automatiquement
user.age = 31
user.update()
Nom de table personnalisé
Par défaut le nom de la table est le nom de la classe. Pour le surcharger :
class User(AppPersistence):
_table = "app_user"
Clé primaire composite
class Conge(AppPersistence):
_pk = ("calendrier_id", "date_conge")
conge = Conge.get(42, "2025-06-01", con=con)
Attributs transitoires
Tout attribut commençant par _ est ignoré lors des opérations SQL :
class User(AppPersistence):
def __init__(self, id, username, email, age):
self.id = id
self.username = username
self.email = email
self.age = age
self._cache = {} # jamais envoyé en base
self._dirty = False # jamais envoyé en base
Représentation
__repr__ par défaut affiche la table, les colonnes PK puis le reste :
User[id=1 | username='alice', email='alice@example.com', age=30]
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 sqlite_persist-0.2.0.tar.gz.
File metadata
- Download URL: sqlite_persist-0.2.0.tar.gz
- Upload date:
- Size: 5.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fedb819c2ef60d0836a0775f9171a505af7ef88f2c5c47d3a029e0e3aebd01e8
|
|
| MD5 |
943e46af460feaad0dd8296514c93ffe
|
|
| BLAKE2b-256 |
9a83c08f53c81258b4e6d3991070f6e369c3e1d1fc8b4b6c2db361ba0ab87d7b
|
File details
Details for the file sqlite_persist-0.2.0-py3-none-any.whl.
File metadata
- Download URL: sqlite_persist-0.2.0-py3-none-any.whl
- Upload date:
- Size: 6.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1dcf6c192268a30c81d6ef71dbeec205cfe0edb44a9287c2b89560b77bcdbe87
|
|
| MD5 |
dc74821210ef90ebe8d537e33cd0c119
|
|
| BLAKE2b-256 |
971ccc3e618b143d512fac441f75e524128784fb6ab114feb302f59a9eb75aca
|