Skip to main content

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


Download files

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

Source Distribution

sqlite_persist-0.2.0.tar.gz (5.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sqlite_persist-0.2.0-py3-none-any.whl (6.4 kB view details)

Uploaded Python 3

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

Hashes for sqlite_persist-0.2.0.tar.gz
Algorithm Hash digest
SHA256 fedb819c2ef60d0836a0775f9171a505af7ef88f2c5c47d3a029e0e3aebd01e8
MD5 943e46af460feaad0dd8296514c93ffe
BLAKE2b-256 9a83c08f53c81258b4e6d3991070f6e369c3e1d1fc8b4b6c2db361ba0ab87d7b

See more details on using hashes here.

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

Hashes for sqlite_persist-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1dcf6c192268a30c81d6ef71dbeec205cfe0edb44a9287c2b89560b77bcdbe87
MD5 dc74821210ef90ebe8d537e33cd0c119
BLAKE2b-256 971ccc3e618b143d512fac441f75e524128784fb6ab114feb302f59a9eb75aca

See more details on using hashes here.

Supported by

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