Well the other way doesn't quite work as if I mark none of the columns as foreign in the primary join, sqla then assumes / guesses all of them are.
Let me test with passive. On Wed, Oct 10, 2018, 13:30 Mike Bayer <mike...@zzzcomputing.com> wrote: > On Wed, Oct 10, 2018 at 1:27 PM Alex Rothberg <agrothb...@gmail.com> > wrote: > > > > And I'll reiterate, not worth doing it all from the original single > relationship (ie not needing to either add more relationships, have > warnings or use the more obscure feature you outlined)? Seems like that > would be cleaner in code. > > you mean take the viewonly=True off the existing relationship? sure > you can do that. but if you mutate the elements in that collection, > you can incur a change that is conflicting with the other objects. > that's why I suggested making the non-viewonly a private member, but > either way works. > > > > > > On Wed, Oct 10, 2018, 13:17 Mike Bayer <mike...@zzzcomputing.com> wrote: > >> > >> the raise load issue is because without passive_deletes, it has to > >> load the collection to make sure those objects are all updated. > >> passive_deletes fixes, now you just have a warning. or use the unit > >> of work recipe which is more direct. > >> On Wed, Oct 10, 2018 at 1:15 PM Alex Rothberg <agrothb...@gmail.com> > wrote: > >> > > >> > Not just for warning. Also this raise load issue. yes, i see that I > can't mark none. If I could though, that would be awesome since I think it > would solve this problem? I can test by setting one foreign and seeing if > that works. > >> > > >> > On Wednesday, October 10, 2018 at 1:13:32 PM UTC-4, Mike Bayer wrote: > >> >> > >> >> On Wed, Oct 10, 2018 at 12:56 PM Alex Rothberg <agrot...@gmail.com> > wrote: > >> >> > > >> >> > let me get that. in the meantime, what are your thoughts on just > removing the view only from the original relationship and then using an > explicit primary join where none of the columns are marked foreign? > Theoretically that should solve this problem, no? > >> >> > >> >> is this just for the warning? I don't think the relationship() can > >> >> be set up with no columns marked as foreign, it takes that as a cue > >> >> that it should figure out the "foreign" columns on its own. > >> >> > >> >> There's another way to make sure Employee is always dependent on > >> >> FundTitle but it's a little bit off-label. Add the dependency you > >> >> want directly into the unit of work: > >> >> > >> >> from sqlalchemy.orm import unitofwork > >> >> from sqlalchemy import event > >> >> > >> >> > >> >> @event.listens_for(Session, "before_flush") > >> >> def _add_dep(session, context, objects): > >> >> context.dependencies.update([ > >> >> ( > >> >> unitofwork.SaveUpdateAll(context, inspect(FundTitle)), > >> >> unitofwork.SaveUpdateAll(context, inspect(Employee)) > >> >> ) > >> >> ]) > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> > > >> >> > On Wednesday, October 10, 2018 at 12:41:25 PM UTC-4, Alex Rothberg > wrote: > >> >> >> > >> >> >> Is it possible to specific a non viewonly relationship in which I > have a primary join specified in which none of the fk's are marked > "foreign"? ie where I can mark the relationship dependancy but it wont set > any columns? It looks like there may be some logic in sqla that assume all > columns are fk if none are specified as foreign? > >> >> >> > >> >> >> On Wednesday, October 10, 2018 at 11:56:49 AM UTC-4, Alex > Rothberg wrote: > >> >> >>> > >> >> >>> So one minor issue and one big issue with that solution: > >> >> >>> 1. minor issue, I now get these: SAWarning: relationship 'XXXX' > will copy columnYYYY to column ZZZZ, which conflicts with relationship(s): > '.... > >> >> >>> 2. major issue, I use raiseload("*") and now I start seeing: > sqlalchemy.exc.InvalidRequestError: 'Employee._ft_for_dependency' is not > available due to lazy='raise' > >> >> >>> > >> >> >>> On Wednesday, October 10, 2018 at 9:57:55 AM UTC-4, Mike Bayer > wrote: > >> >> >>>> > >> >> >>>> On Tue, Oct 9, 2018 at 6:45 PM Alex Rothberg < > agrot...@gmail.com> wrote: > >> >> >>>> > > >> >> >>>> > Okay with some small tweaks to your original code, I am able > to show the issue I am having. comment out flush to see issue: > >> >> >>>> > >> >> >>>> so what you're doing here is making Employee dependent on > FundTitle, > >> >> >>>> which makes this a little out of the ordinary but this is > fine. You > >> >> >>>> need to give the ORM a clue that this dependency exists, since > it > >> >> >>>> never looks at foreign key constraints unless you tell it to. > >> >> >>>> Adding a relationship to FundTitle that doesn't have > viewonly=True is > >> >> >>>> an easy way to do this, there's no need to ever make use of the > >> >> >>>> relationship otherwise: > >> >> >>>> > >> >> >>>> class Employee(Base): > >> >> >>>> __tablename__ = 'employee' > >> >> >>>> > >> >> >>>> # ... > >> >> >>>> fund_title = relationship(FundTitle, viewonly=True) > >> >> >>>> > >> >> >>>> _ft_for_dependency = relationship(FundTitle) > >> >> >>>> > >> >> >>>> __table_args__ = ( > >> >> >>>> ForeignKeyConstraint( > >> >> >>>> (title_id, department_id, fund_id), > >> >> >>>> (FundTitle.title_id, FundTitle.department_id, > FundTitle.fund_id) > >> >> >>>> ), > >> >> >>>> ) > >> >> >>>> > >> >> >>>> then you can take the flush() out and there's no issue, as long > as > >> >> >>>> you're always making sure that FundTitle object is present > either in > >> >> >>>> the current Session or the row in the database exists. > >> >> >>>> > >> >> >>>> > >> >> >>>> > > >> >> >>>> > from sqlalchemy import * > >> >> >>>> > from sqlalchemy.orm import * > >> >> >>>> > from sqlalchemy.ext.declarative import declarative_base > >> >> >>>> > > >> >> >>>> > Base = declarative_base() > >> >> >>>> > > >> >> >>>> > > >> >> >>>> > class Title(Base): > >> >> >>>> > __tablename__ = 'title' > >> >> >>>> > id = Column(Integer, primary_key=True) > >> >> >>>> > department_id = Column(ForeignKey('department.id'), > nullable=False) > >> >> >>>> > > >> >> >>>> > department = relationship(lambda: Department) > >> >> >>>> > > >> >> >>>> > > >> >> >>>> > class Department(Base): > >> >> >>>> > __tablename__ = 'department' > >> >> >>>> > id = Column(Integer, primary_key=True) > >> >> >>>> > > >> >> >>>> > > >> >> >>>> > class Fund(Base): > >> >> >>>> > __tablename__ = 'fund' > >> >> >>>> > id = Column(Integer, primary_key=True) > >> >> >>>> > title_id = Column(ForeignKey('title.id'), nullable=False) > >> >> >>>> > department_id = Column(ForeignKey('department.id'), > nullable=False) > >> >> >>>> > department = relationship("Department") > >> >> >>>> > title = relationship("Title") > >> >> >>>> > > >> >> >>>> > > >> >> >>>> > class FundTitle(Base): > >> >> >>>> > __tablename__ = 'fund_title' > >> >> >>>> > id = Column(Integer, primary_key=True) > >> >> >>>> > title_id = Column(ForeignKey('title.id'), nullable=False) > >> >> >>>> > department_id = Column(ForeignKey('department.id'), > nullable=False) > >> >> >>>> > fund_id = Column(ForeignKey('fund.id'), nullable=False) > >> >> >>>> > department = relationship("Department") > >> >> >>>> > title = relationship("Title") > >> >> >>>> > fund = relationship("Fund") > >> >> >>>> > > >> >> >>>> > __table_args__ = ( > >> >> >>>> > UniqueConstraint( > >> >> >>>> > title_id, department_id, fund_id > >> >> >>>> > ), > >> >> >>>> > ) > >> >> >>>> > > >> >> >>>> > > >> >> >>>> > class Employee(Base): > >> >> >>>> > __tablename__ = 'employee' > >> >> >>>> > id = Column(Integer, primary_key=True) > >> >> >>>> > title_id = Column(ForeignKey('title.id'), nullable=False) > >> >> >>>> > department_id = Column(ForeignKey('department.id'), > nullable=False) > >> >> >>>> > fund_id = Column(ForeignKey('fund.id'), nullable=False) > >> >> >>>> > > >> >> >>>> > department = relationship(lambda: Department) > >> >> >>>> > title = relationship("Title") > >> >> >>>> > fund = relationship("Fund") > >> >> >>>> > > >> >> >>>> > fund_title = relationship(FundTitle, viewonly=True) > >> >> >>>> > > >> >> >>>> > > >> >> >>>> > __table_args__ = ( > >> >> >>>> > ForeignKeyConstraint( > >> >> >>>> > (title_id, department_id, fund_id), > (FundTitle.title_id, FundTitle.department_id, FundTitle.fund_id) > >> >> >>>> > ), > >> >> >>>> > ) > >> >> >>>> > > >> >> >>>> > > >> >> >>>> > e = create_engine("postgresql://localhost/test_issue", > echo=False) > >> >> >>>> > > >> >> >>>> > # Base.metadata.drop_all(e) > >> >> >>>> > Base.metadata.create_all(e) > >> >> >>>> > > >> >> >>>> > s = Session(e) > >> >> >>>> > # s.rollback() > >> >> >>>> > > >> >> >>>> > while True: > >> >> >>>> > d1 = Department() > >> >> >>>> > t1 = Title(department=d1) > >> >> >>>> > f1 = Fund(department=d1, title=t1) > >> >> >>>> > ft1 = FundTitle(title=t1, department=d1, fund=f1) > >> >> >>>> > > >> >> >>>> > s.add_all([d1, t1, f1, ft1]) > >> >> >>>> > > >> >> >>>> > s.flush() > >> >> >>>> > > >> >> >>>> > e1 = Employee(title=t1, department=d1, fund=f1) > >> >> >>>> > > >> >> >>>> > s.add_all([e1,]) > >> >> >>>> > s.commit() > >> >> >>>> > > >> >> >>>> > On Tuesday, October 9, 2018 at 12:20:30 PM UTC-4, Mike Bayer > wrote: > >> >> >>>> >> > >> >> >>>> >> On Tue, Oct 9, 2018 at 10:44 AM Alex Rothberg < > agrot...@gmail.com> wrote: > >> >> >>>> >> > > >> >> >>>> >> > In looking at what you wrote doesn't this cause an fk > violation (it does for me): > >> >> >>>> >> > 2018-10-08 10:18:38,760 INFO sqlalchemy.engine.base.Engine > INSERT INTO employee (title_id, department_id, fund_id) VALUES > (%(title_id)s, %(department_id)s, %(fund_id)s) RETURNING employee.id > >> >> >>>> >> > 2018-10-08 10:18:38,763 INFO sqlalchemy.engine.base.Engine > INSERT INTO fund_title (title_id, department_id, fund_id) VALUES > (%(title_id)s, %(department_id)s, %(fund_id)s) RETURNING fund_title.id > >> >> >>>> >> > > >> >> >>>> >> > in that a a (non deferred) fk is violated between employee > and fund_title ? > >> >> >>>> >> > >> >> >>>> >> see we need to see how youve laid out your > ForeignKeyConstraints, if > >> >> >>>> >> they are composite and overlapping, there are additional > options that > >> >> >>>> >> may be needed (specifically the post_update flag). you'll > note I laid > >> >> >>>> >> out all FKs as single column. > >> >> >>>> >> > >> >> >>>> >> > > >> >> >>>> >> > On Mon, Oct 8, 2018 at 10:20 AM Mike Bayer < > mik...@zzzcomputing.com> wrote: > >> >> >>>> >> >> > >> >> >>>> >> >> On Sun, Oct 7, 2018 at 7:11 PM Alex Rothberg < > agrot...@gmail.com> wrote: > >> >> >>>> >> >> > > >> >> >>>> >> >> > Okay so I investigated / thought about this further. > The issue is that while I do have a relationship between the various > models, some of the relationships are viewonly since I have overlapping fks. > >> >> >>>> >> >> > > >> >> >>>> >> >> > For example I have a model Employee, which has fks: > department_id, title_id, and fund_id. The related models are Department (fk > department_id), Title (fk department_id and title_id) , Fund (fk fund_id) > and FundTitle (fk department_id, title_id and fund_id). I have set > FundTitle to viewonly. When updating / creating an Employee, I do create > and add a new FundTitle to the session, however I don't assign it to the > employee as the relationship is viewonly. If I don't flush before making > the assignment, the final flush / commit attempts to update / create the > employee before creating the FundTitle. > >> >> >>>> >> >> > >> >> >>>> >> >> let's work with source code that is runnable (e.g. > MCVE). Below is > >> >> >>>> >> >> the model that it seems you are describing, and then > there's a > >> >> >>>> >> >> demonstration of assembly of all those components using > relationships, > >> >> >>>> >> >> a single flush and it all goes in in the correct order, > all FKs are > >> >> >>>> >> >> nullable=False. > >> >> >>>> >> >> > >> >> >>>> >> >> from sqlalchemy import * > >> >> >>>> >> >> from sqlalchemy.orm import * > >> >> >>>> >> >> from sqlalchemy.ext.declarative import declarative_base > >> >> >>>> >> >> > >> >> >>>> >> >> Base = declarative_base() > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> class Employee(Base): > >> >> >>>> >> >> __tablename__ = 'employee' > >> >> >>>> >> >> id = Column(Integer, primary_key=True) > >> >> >>>> >> >> title_id = Column(ForeignKey('title.id'), > nullable=False) > >> >> >>>> >> >> department_id = Column(ForeignKey('department.id'), > nullable=False) > >> >> >>>> >> >> fund_id = Column(ForeignKey('fund.id'), > nullable=False) > >> >> >>>> >> >> department = relationship("Department") > >> >> >>>> >> >> title = relationship("Title") > >> >> >>>> >> >> fund = relationship("Fund") > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> class Title(Base): > >> >> >>>> >> >> __tablename__ = 'title' > >> >> >>>> >> >> id = Column(Integer, primary_key=True) > >> >> >>>> >> >> department_id = Column(ForeignKey('department.id'), > nullable=False) > >> >> >>>> >> >> department = relationship("Department") > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> class Department(Base): > >> >> >>>> >> >> __tablename__ = 'department' > >> >> >>>> >> >> id = Column(Integer, primary_key=True) > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> class Fund(Base): > >> >> >>>> >> >> __tablename__ = 'fund' > >> >> >>>> >> >> id = Column(Integer, primary_key=True) > >> >> >>>> >> >> title_id = Column(ForeignKey('title.id'), > nullable=False) > >> >> >>>> >> >> department_id = Column(ForeignKey('department.id'), > nullable=False) > >> >> >>>> >> >> department = relationship("Department") > >> >> >>>> >> >> title = relationship("Title") > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> class FundTitle(Base): > >> >> >>>> >> >> __tablename__ = 'fund_title' > >> >> >>>> >> >> id = Column(Integer, primary_key=True) > >> >> >>>> >> >> title_id = Column(ForeignKey('title.id'), > nullable=False) > >> >> >>>> >> >> department_id = Column(ForeignKey('department.id'), > nullable=False) > >> >> >>>> >> >> fund_id = Column(ForeignKey('fund.id'), > nullable=False) > >> >> >>>> >> >> department = relationship("Department") > >> >> >>>> >> >> title = relationship("Title") > >> >> >>>> >> >> fund = relationship("Fund") > >> >> >>>> >> >> > >> >> >>>> >> >> e = create_engine("postgresql://scott:tiger@localhost/test", > echo=True) > >> >> >>>> >> >> Base.metadata.create_all(e) > >> >> >>>> >> >> > >> >> >>>> >> >> s = Session(e) > >> >> >>>> >> >> > >> >> >>>> >> >> d1 = Department() > >> >> >>>> >> >> t1 = Title(department=d1) > >> >> >>>> >> >> f1 = Fund(department=d1, title=t1) > >> >> >>>> >> >> ft1 = FundTitle(title=t1, department=d1, fund=f1) > >> >> >>>> >> >> e1 = Employee(title=t1, department=d1, fund=f1) > >> >> >>>> >> >> > >> >> >>>> >> >> s.add_all([d1, t1, f1, ft1, e1]) > >> >> >>>> >> >> s.commit() > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> the INSERTs can be ordered naturally here and the unit of > work will do > >> >> >>>> >> >> that for you if you use relationship: > >> >> >>>> >> >> > >> >> >>>> >> >> BEGIN (implicit) > >> >> >>>> >> >> 2018-10-08 10:18:38,750 INFO > sqlalchemy.engine.base.Engine INSERT INTO > >> >> >>>> >> >> department DEFAULT VALUES RETURNING department.id > >> >> >>>> >> >> 2018-10-08 10:18:38,750 INFO > sqlalchemy.engine.base.Engine {} > >> >> >>>> >> >> 2018-10-08 10:18:38,753 INFO > sqlalchemy.engine.base.Engine INSERT INTO > >> >> >>>> >> >> title (department_id) VALUES (%(department_id)s) > RETURNING title.id > >> >> >>>> >> >> 2018-10-08 10:18:38,753 INFO > sqlalchemy.engine.base.Engine {'department_id': 1} > >> >> >>>> >> >> 2018-10-08 10:18:38,757 INFO > sqlalchemy.engine.base.Engine INSERT INTO > >> >> >>>> >> >> fund (title_id, department_id) VALUES (%(title_id)s, > >> >> >>>> >> >> %(department_id)s) RETURNING fund.id > >> >> >>>> >> >> 2018-10-08 10:18:38,757 INFO sqlalchemy.engine.base.Engine > >> >> >>>> >> >> {'title_id': 1, 'department_id': 1} > >> >> >>>> >> >> 2018-10-08 10:18:38,760 INFO > sqlalchemy.engine.base.Engine INSERT INTO > >> >> >>>> >> >> employee (title_id, department_id, fund_id) VALUES > (%(title_id)s, > >> >> >>>> >> >> %(department_id)s, %(fund_id)s) RETURNING employee.id > >> >> >>>> >> >> 2018-10-08 10:18:38,761 INFO sqlalchemy.engine.base.Engine > >> >> >>>> >> >> {'title_id': 1, 'department_id': 1, 'fund_id': 1} > >> >> >>>> >> >> 2018-10-08 10:18:38,763 INFO > sqlalchemy.engine.base.Engine INSERT INTO > >> >> >>>> >> >> fund_title (title_id, department_id, fund_id) VALUES > (%(title_id)s, > >> >> >>>> >> >> %(department_id)s, %(fund_id)s) RETURNING fund_title.id > >> >> >>>> >> >> 2018-10-08 10:18:38,764 INFO sqlalchemy.engine.base.Engine > >> >> >>>> >> >> {'title_id': 1, 'department_id': 1, 'fund_id': 1} > >> >> >>>> >> >> 2018-10-08 10:18:38,766 INFO > sqlalchemy.engine.base.Engine COMMIT > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> > >> >> >>>> >> >> > > >> >> >>>> >> >> > On Tuesday, September 18, 2018 at 9:02:30 AM UTC-4, > Mike Bayer wrote: > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> if there are no dependencies between two particular > objects of > >> >> >>>> >> >> >> different classes, say A and B, then there is no > deterministic > >> >> >>>> >> >> >> ordering between them. For objects of the same > class, they are > >> >> >>>> >> >> >> inserted in the order in which they were added to the > Session. > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> the correct way to solve this problem in SQLAlchemy is > to use > >> >> >>>> >> >> >> relationship() fully. I know you've stated that these > objects have a > >> >> >>>> >> >> >> relationship() between them but you have to actually > use it, that is: > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> obj_a = A() > >> >> >>>> >> >> >> obj_b = B() > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> obj_a.some_relationship = obj_b # will definitely > flush correctly > >> >> >>>> >> >> >> unless there is a bug > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> OTOH if you are only using foreign key attributes, the > ORM does *not* > >> >> >>>> >> >> >> have any idea in how it should be flushing these: > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> obj_a = A() > >> >> >>>> >> >> >> obj_b = B() > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> obj_a.some_fk = obj_b.some_id # ORM doesn't care > about this, no > >> >> >>>> >> >> >> ordering is implied > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> since you said you're not setting any IDs, I'm not > sure how you could > >> >> >>>> >> >> >> be doing the above. > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> > >> >> >>>> >> >> >> On Tue, Sep 18, 2018 at 5:53 AM Simon King < > si...@simonking.org.uk> wrote: > >> >> >>>> >> >> >> > > >> >> >>>> >> >> >> > It's not something I've ever looked into, but I'm > not aware of any > >> >> >>>> >> >> >> > debugging options here, no. You'd probably want to > start by scattering > >> >> >>>> >> >> >> > print statements around the UOWTransaction class > >> >> >>>> >> >> >> > ( > https://bitbucket.org/zzzeek/sqlalchemy/src/c94d67892e68ac317d72eb202cca427084b3ca74/lib/sqlalchemy/orm/unitofwork.py?at=master&fileviewer=file-view-default#unitofwork.py-111 > ) > >> >> >>>> >> >> >> > > >> >> >>>> >> >> >> > Looking at that code made me wonder whether you've > set any particular > >> >> >>>> >> >> >> > cascade options on your relationship; I'm not sure > if cascade options > >> >> >>>> >> >> >> > affect the dependency calculation. > >> >> >>>> >> >> >> > > >> >> >>>> >> >> >> > Simon > >> >> >>>> >> >> >> > > >> >> >>>> >> >> >> > On Tue, Sep 18, 2018 at 5:28 AM Alex Rothberg < > agrot...@gmail.com> wrote: > >> >> >>>> >> >> >> > > > >> >> >>>> >> >> >> > > In order to guide me in stripping down this code > to produce an example for positing, are there any options / flags / > introspections I can turn on to understand how sql makes decisions about > the order in which is writes statements to the DB? > >> >> >>>> >> >> >> > > > >> >> >>>> >> >> >> > > On Friday, September 14, 2018 at 10:13:45 AM > UTC-4, Simon King wrote: > >> >> >>>> >> >> >> > >> > >> >> >>>> >> >> >> > >> In that case can you show us the code that is > causing the problem? > >> >> >>>> >> >> >> > >> On Fri, Sep 14, 2018 at 2:55 PM Alex Rothberg < > agrot...@gmail.com> wrote: > >> >> >>>> >> >> >> > >> > > >> >> >>>> >> >> >> > >> > I am not generating any IDs myself and I > already have relationships between the models. > >> >> >>>> >> >> >> > >> > > >> >> >>>> >> >> >> > >> > On Friday, September 14, 2018 at 4:33:08 AM > UTC-4, Simon King wrote: > >> >> >>>> >> >> >> > >> >> > >> >> >>>> >> >> >> > >> >> On Thu, Sep 13, 2018 at 10:50 PM Alex Rothberg > <agrot...@gmail.com> wrote: > >> >> >>>> >> >> >> > >> >> > > >> >> >>>> >> >> >> > >> >> > Is it possible to hint at sqla the order in > which it should write out changes to the DB? > >> >> >>>> >> >> >> > >> >> > > >> >> >>>> >> >> >> > >> >> > I am having issues in which I add two new > objects to a session, a and b where a depends on b, but sqla is flushing a > before b leading to an fk issue. I can solve this a few ways: explicitly > calling flush after adding b, or changing the fk constraint to be initially > deferred. Ideally I would not have to do either of these. > >> >> >>>> >> >> >> > >> >> > > >> >> >>>> >> >> >> > >> >> > >> >> >>>> >> >> >> > >> >> If you have configured a relationship between > the two classes > >> >> >>>> >> >> >> > >> >> ( > http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#building-a-relationship > ), > >> >> >>>> >> >> >> > >> >> and you've linked the objects together using > that relationship (a.b = > >> >> >>>> >> >> >> > >> >> b), then SQLAlchemy will flush them in the > correct order. If you are > >> >> >>>> >> >> >> > >> >> generating your IDs in Python and assigning > them to the primary and > >> >> >>>> >> >> >> > >> >> foreign key columns directly, SQLAlchemy > probably won't understand the > >> >> >>>> >> >> >> > >> >> dependency. > >> >> >>>> >> >> >> > >> >> > >> >> >>>> >> >> >> > >> >> Does using a relationship fix your problem? > >> >> >>>> >> >> >> > >> >> > >> >> >>>> >> >> >> > >> >> Simon > >> >> >>>> >> >> >> > >> > > >> >> >>>> >> >> >> > >> > -- > >> >> >>>> >> >> >> > >> > 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. > >> >> >>>> >> >> >> > > 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. > >> >> >>>> >> >> >> > 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. > >> >> >>>> >> >> > 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 a > topic in the Google Groups "sqlalchemy" group. > >> >> >>>> >> >> To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/fZMJQoI2qkY/unsubscribe. > >> >> >>>> >> >> To unsubscribe from this group and all its topics, 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. > >> >> >>>> >> > 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. > >> >> >>>> > 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. > >> >> > 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+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. > >> > >> -- > >> 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 a topic in the > Google Groups "sqlalchemy" group. > >> To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/fZMJQoI2qkY/unsubscribe. > >> To unsubscribe from this group and all its topics, 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. > > > > -- > > 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. > > -- > 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 a topic in the > Google Groups "sqlalchemy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/fZMJQoI2qkY/unsubscribe. > To unsubscribe from this group and all its topics, 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. > -- 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.