On 03/07/2020 16:21, Pedro Ferreira wrote:
> Hi,
>
> I was wondering if there's some way to create some sort of a "virtual"
> model which is not based on an actual table?
>
> Use case: I have a model (e.g. `Room`) which contains a `data` JSONB
> attribute/column which is supposed to store plugin-specific data. I
> would like plugin code to be able to create a "virtual" model which
> references `Room` 1-to-1 and injects a `plugin_data` backref into it.
> That means I would be able to do `room.plugin_data.user`, for instance,
> which would use `room.data['user_id']` to fetch a `User` object.


Spyne contains some work towards that goal.

I added an example[1]. What works: the Preferences object gets
serialized to json and stored as jsonb. It's also deserialized from json
to an instance when read. It's implemented as a generic UserDefinedType[2].

Caveats:

 1. It's postgresql-only (never tested on other RDBMS, maybe it'll work!
    help is welcome)
 2. It doesn't do fancy orm stuff like mapping the value of a user_id
    field to a user instance.
 3. Doesn't automatically mark stuff dirty as a field in the subobject
    changes[3].
 4. Doesn't support marking subfields dirty -- When the subobject is
    marked as dirty (using flag_dirty[4]), the whole json document is
    updated instead of just the changed subfield. (using jsonb_set[5]).

Disclaimer: I'm the author of Spyne.

I hope it helps!

Best,
Burak

[1]:
https://github.com/arskom/spyne/blob/bc8c3567992abcc387c135d5f8e19c76439c2482/examples/sql/sql_crud.py#L60

[2]:
https://github.com/arskom/spyne/blob/bc8c3567992abcc387c135d5f8e19c76439c2482/spyne/store/relational/document.py#L187

[3]:
https://github.com/arskom/spyne/blob/bc8c3567992abcc387c135d5f8e19c76439c2482/spyne/test/test_sqlalchemy.py#L148

[4]:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.attributes.flag_dirt

[5]:
https://www.postgresql.org/docs/12/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/82297adf-16ff-adea-e62b-e0b6f7d3ebb6%40burakarslan.com.

Reply via email to