Journal sqlramen un remplacement à sqlsoup

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
7
2
oct.
2025

Alors que je pleurais la disparition de sqlsoup et ré-écrivais pour la 5é fois le code minimal pour le remplacer je me suis dit ; tu pourrais offrir un module équivalent.

SQLRamen, un peu comme SQLSoup

SQLRamen offre une interface minimaliste au dessus de sqlalchemy pour avoir une console introspective sur une base de données… Ce qui est avec une API différente ce que faisait SQLSoup qui a disparu avec sqlalchemy 2.

Le code est minimal et est basé sur automap.

Installation

python -m pip install sqlramen

Exemple :

from sqlramen import SQLRamen
db = SQLRamen("sqlite:///../pdca/aide")
user = db.query(db.table.user).filter_by(email="j@j.com").one()
[ l.message for l in user.comment_collection ]
# ['SCAM Manual\r\n\r\nA complete guide to create a guide with scam',
# ...
#  'future plan',
#  'further down']
db.query(db.table.comment.message).join(db.table.comment.user
    ).filter(db.table.user.email=="j@j.com").all()
# same
print([l for l in db.table.user.__table__.c])
# [Column('id', INTEGER(), table=<user>, primary_key=True, nullable=False),
# Column('pic_file', TEXT(), table=<user>),
# Column('name', TEXT(), table=<user>, nullable=False),
# Column('email', TEXT(), table=<user>, nullable=False),
# Column('secret_token', TEXT(), table=<user>),
# Column('secret_password', TEXT(), table=<user>, nullable=False)]
db.raw("select * from comment limit 5").all()
#[('2025-01-12 12:52:09', 1, 1, None, 'SCAM Manual\r\n\r\nA complete guide to create a guide with scam', None, 'story'),
# ('2025-01-12 13:28:14', 2, 1, 1, 'Synopsis\r\n\r\nA frontend to a pandoc toolchain to build a book in a supposedly new way.', None, 'story_item'),
# ('2025-01-12 13:28:47', 3, 1, 1, 'How to install and start it\r\n', None, 'story_item'),
# ('2025-01-12 13:29:48', 4, 1, 1, 'walkthrough to create this manual with the tool\r\n\r\nFirst post//landing page', None, 'story_item'),
# ('2025-01-12 13:30:23', 5, 1, 3, 'Quickstart', None, 'comment')]

db_introspect

Le module est livré avec un grapheur de base de données dont voici un exemple :

db_introspect sqlite:///../pdca/aide && xdot out.dot

Ce qui donne le résultat suivant

digramme entité relation

  • # typo ?

    Posté par  . Évalué à 3 (+1/-0).

    Traceback (most recent call last):
    File "testramen.py", line 4, in
    NameError: name 'u' is not defined

  • # Génial ! J'en prends 3 ! (c'est pour offrir)

    Posté par  (Mastodon) . Évalué à 5 (+2/-0). Dernière modification le 03 octobre 2025 à 07:58.

    Je peux récupérer toutes mes consos et production électrique depuis HomeAssistant sous la forme d'un bordel sur 4 ou 5 tables SQLite. Mon but est de faire des calculs plus évolués sur ma conso réelle, comme l'apport d'une batterie tampon par exemple.

    J'ai essayé un code naïf en Python, ça marche, mais il me faut 1 ou 2 minutes pour me balader dans 3 ans d'historique.

    Du coup je vais tenter la formule Ramen, je te dirai ce que ça donne :)

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Génial ! J'en prends 3 ! (c'est pour offrir)

      Posté par  (site web personnel) . Évalué à 2 (+1/-0).

      tiens je te convertis cet exemple à l'utilisation de sqlramen

      https://yahi.readthedocs.io/en/latest/misusing.html#graphing-data-from-a-database

      from archery import mdict
      from datetime import datetime as dt
      from sqlramen import SQLRamen
      from json import dump
      
      db = SQLRamen("postgresql://jul@/trollo")
      
      date = lambda ts: ts.strftime("%Y-%m-%d")
      dh = lambda ts: ts.strftime("%Y-%j %m-%d:%H")
      
      
      res = mdict()
      for post in db.query(db.table.posts).all():
          res += mdict(
                  by_type=mdict({ post.maybe_spam and "spam" or "ham" : 1 }),
                  date_all = mdict({date(post.created_at) : 1}),
                  heat_day_score = mdict({dh(post.created_at) :post.score}),
          )
      
      dump(res, open("data.js", "w"), indent=4)

      Ça permet de faire un histogramme (top40), une série chronologique, et une heatmap.

      Le lien vers la doc indique comment obtenir les graphs.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.