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.