Well, here's my solution that works exactly the way I want it,
@classmethod
def from_flat_json(cls, d=None, db_enable_relationship_loading=True,
**kwargs):
# noinspection PyArgumentList
new_instance = cls(**d, **kwargs)
state = instance_state(new_instance)
mapper = state.mapper
# noinspection PyProtectedMember
identity_class = mapper._identity_class
pk_cols = mapper.primary_key
identity_token = None
identitykey = (
identity_class,
tuple([getattr(new_instance, column.key) for column in pk_cols]),
identity_token
)
session = get_db_session()
state.key = identitykey
state.identity_token = identity_token
state.session_id = session.hash_key
# noinspection PyProtectedMember
session.identity_map._add_unpresent(state, identitykey)
if db_enable_relationship_loading:
session.enable_relationship_loading(new_instance)
return new_instance
It feels like you're against this approach, but this is the design /
pattern that I'd like my tests to follow, and I'm sharing in case anyone
else would like similar.
This now allows me, in my completely dB connection free testing environment
to do,
sport = Sport.from_flat_json(dict(name='Soccer', id=1))
competition = Competition.from_flat_json(dict(name='MLS', id=1, sport_id=1))
And without doing anything else,
assert competition.sport == sport
Is now also correct, which again is exactly how I want it to be. With
this, when a situation (bug/crash) occurs, I can just "dump" a snapshot of
my system to json, load that into my local environment, and debug it "as
live", with everything set up correctly, as if all the dB rows had come
from the database, without any need for double-jobbing anything.
On Saturday, September 29, 2018 at 9:12:51 PM UTC+1, Mike Bayer wrote:
>
> My advice is to simply make a sqlite memory database for testing which is
> an almost universal pattern for test suites.
>
>
> You can even make a database per test, that's a common pattern.
> Otherwise you have to mock everything and yes "double job" it. The ORM
> doesn't want to "double job" it either, with a sqlite memory database
> easily available it doesn't have to reinvent what the database does, which
> would be not only a massively complicated endeavor it also would never
> behave quite the same way either.
>
--
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.