Why
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.
Example
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.
"""
Github DCDB