Yes, that's exactly what I want. No queries to the database, at any time *exactly*.
However, doing that, I get sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: sport [SQL: 'INSERT INTO sport ...] (Background on this error at: http://sqlalche.me/e/e3q8) I haven't created, nor - if possible - really want to create any tables for the tests. But it looks like doing s.flush() *is* trying to write to the database? On Saturday, September 29, 2018 at 3:18:24 PM UTC+1, Mike Bayer wrote: > > On Sat, Sep 29, 2018 at 7:34 AM seaders <sead...@gmail.com <javascript:>> > wrote: > > > > Yep, that helps, nearly doing what I want. > > > > I have a "from_flat_json" function in my base class, so that's a perfect > place to add the `session.enable_relationship_loading` bit for any created > objects - that's now working, which is great. > > > > Only thing that's not wanted / right just yet is the ".commit()". If > possible, I'd even prefer to not have that in the system, but without that, > a1 isn't available for lookup, i.e. (using your example), > > > > a1 = A(id=1) > > s.add(a1) > > s.enable_relationship_loading(a1) > > > > b1 = B(a_id=1) > > s.add(b1) > > s.enable_relationship_loading(b1) > > assert b1.a is a1 > > So what you have above would literally be SQLAlchemy doing the > querying in memory without even using the database, because at no > point above is anything being sent to the database. You don't need > to "commit" the transaction, for your local work, you only need to > flush() so that the row is present in the DB within the transaction: > > a1 = A(id=1) > s.add(a1) > s.flush() > > b1 = B(a_id=1) > s.add(b1) > s.enable_relationship_loading(b1) > assert b1.a is a1 > > > > > > > > > > > > > On Saturday, September 29, 2018 at 3:33:10 AM UTC+1, Mike Bayer wrote: > >> > >> > >> yes that's what those two flags are doing. the way the ORM is > >> designed, it wants you to be setting comp.sport = sport, not > >> comp.sport_id = id, but there's a fair degree of special features > >> these days that allow people to work the other way since it is so > >> commonly requested, which are specifically what those two flags are > >> for. > >> > >> an overview of the situation is at > >> > https://docs.sqlalchemy.org/en/latest/faq/sessions.html#i-set-the-foo-id-attribute-on-my-instance-to-7-but-the-foo-attribute-is-still-none-shouldn-t-it-have-loaded-foo-with-id-7, > > > >> which is probably the first FAQ question we've ever had. The API > >> features that correspond to load_on_pending and load_pending are the > >> load_on_pending relationship flag: > >> > https://docs.sqlalchemy.org/en/latest/orm/relationship_api.html?highlight=load_on_pending#sqlalchemy.orm.relationship.params.load_on_pending > > >> , and enable_relationship_loading at > >> > https://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.enable_relationship_loading, > > > >> which does the same thing with a different scope, that is, for > >> individual objects rather than an entire mapping. > >> > >> both APIs do a similar thing, it's just that load_on_pending is set at > >> the level of the class mapping on the relationship, whereas > >> enable_relationship_loading you can just enable for any individual > >> object without any change to the mapping which may be better for > >> running tests. > >> > >> since I never use these I feel I had to test them out to make sure I'm > >> not mis-characterizing, so it looks like this. here is > >> load_on_pending: > >> > >> class A(Base): > >> __tablename__ = 'a' > >> > >> id = Column(Integer, primary_key=True) > >> bs = relationship("B", backref=backref("a", load_on_pending=True)) > >> > >> > >> class B(Base): > >> __tablename__ = 'b' > >> id = Column(Integer, primary_key=True) > >> a_id = Column(ForeignKey("a.id")) > >> > >> > >> s = Session(e) > >> > >> a1 = A(id=1) > >> s.add(a1) > >> s.commit() > >> > >> b1 = B(a_id=1) > >> s.add(b1) # note you have to add b1 to the session for it to be > "pending" > >> assert b1.a is a1 > >> > >> Here is enable_relationship_loading: > >> > >> class A(Base): > >> __tablename__ = 'a' > >> > >> id = Column(Integer, primary_key=True) > >> bs = relationship("B", backref="a") > >> > >> > >> class B(Base): > >> __tablename__ = 'b' > >> id = Column(Integer, primary_key=True) > >> a_id = Column(ForeignKey("a.id")) > >> > >> > >> a1 = A(id=1) > >> s.add(a1) > >> s.commit() > >> > >> b1 = B(a_id=1) > >> s.enable_relationship_loading(b1) # note you *don't* have to add to > >> the session for this > >> assert b1.a is a1 > >> > >> you can also add b1 to the session at any time above. > >> > >> hope this helps. > >> > >> > >> > >> > >> > >> > >> > > >> > > >> > -- > >> > 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+...@googlegroups.com. > >> > To post to this group, send email to sqlal...@googlegroups.com. > >> > Visit this group at https://groups.google.com/group/sqlalchemy. > >> > For more options, visit https://groups.google.com/d/optout. > > > > -- > > 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+...@googlegroups.com <javascript:>. > > To post to this group, send email to sqlal...@googlegroups.com > <javascript:>. > > Visit this group at https://groups.google.com/group/sqlalchemy. > > For more options, visit https://groups.google.com/d/optout. > -- 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 post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.