I have some data structures that look like this:
Car:
Seats: [{ID: frontSeatId}, {ID: backSeatId}]
Driver: {'Name':'Joe', 'SalaryUSD': 42000}
SoundSystem:
{'TypeID': androidAutoId, Protocols: [{ID: radioProtocolId}, {ID: bluetoothProtocolId}]}
In this system, we often need to do partial updates, like:Car:
Driver: {'Name': 'Jack'}
SoundSystem:
{Protocols: [{ID: bluetoothProtocolId}]}
Meaning that the SoundSystemProtocols table should delete and create new entries such that the car only supports bluetooth, and the driver should get renamed from Joe to Jack.Is there an ORM that lets you do these partial updates atomically, without writing custom controllers for each Car-like object?
I want ergonomics over performance. I don't mind the language. Ideally it should allow a simple interface where the model defines the controller.
I've tried SQLModel, which promises this, but ended up with confusing JSON validation, mixing between SQLModel types and the internal SQLAlchemy model, and still had to write session.add(seats) by hand anyway.
If this doesn't exist for SQL, does another database support ID-as-value like this, where passing in an ID changes a reference, and passing in a value changes the value at that reference?
I found https://github.com/sqlalchemy/sqlalchemy/discussions/7336#di..., then I added list support by checking the type of kw[key].
something like https://gorm.io/docs/update.html#Update-from-SubQuery ?
Does this do what you are looking for?
https://docs.sqlalchemy.org/en/20/orm/session_transaction.ht...
It's the backing DBMS that will enforce atomicity. Postgres and sqlite allow the semantics of nested transactions with SAVEPOINTs (I don't know about other RDBMSes).