While I do use sqlalchemy and to some extent peewee for my projects, I slowly got tired of having to relearn how to write SQL when I’ve known SQL since the mid-90’s.
DCDB’s design is also aiming for simplicity and minimal behind the scenes automagical behaviors. Instead complexity should be added voluntarily and in such a way that it can be traced back.
import dataclasses as dcs import dcdb @dcs.dataclass() class Foo: name:str age:int db = dcdb.DBConnection(":memory:") # alternatively this can be a file path db.bind(Foo) """ Bind doesn't change Foo in the local scope but instead it creates a new class DCDB_Foo which is stored to the DBConnection in it's table registry. Behind the scenes, a table `Foo` is created to the connected database. No changes to the name are made (eg pluralization). How you wrote your bound dataclasses is almost exactly how it is stored in the sqlite database. An exception is that a .id instance property along with DB methods like: update/save, Create, Get, and Select are added to the class definition. """ record = db.t.Foo(name="Bob", age="44") assert record.name == "Bob" same_record = db.t.Foo.Get("name=?", "Bob") assert record.age == 44 assert record.id == same_record.id record.age = 32 record.save() same_record = db.t.Foo.Get("age=?", 32) assert record.id == same_record.id assert same_record.age == 32 same_record.delete() """ Note it is important to notice that currently same_record and record have the same .id # property but they are different instances and copies of the same record with no shared reference. Changes to one copy will not reflect with the other. """