Thanks a lot, that solved my problem ! On Tuesday, 8 November 2016 17:05:00 UTC+1, Mike Bayer wrote: > > > > On 11/08/2016 10:40 AM, [email protected] <javascript:> wrote: > > Hello, > > > > I am struggling with this case and so far, I haven't seen on > > documentation or on the different posts, a way to solve my problem. > > > > Firstly, I cannot have a ForeignKey linking Child to Parent because > > Parent has a polymorphic identity, and PostgreSQL is not dealing with > > ForeignKey in such cases. Let's say ParentA is a Parent. > > > > So I have to define relationship between Child and Parent "manually" > > > > Thus, I have this : > > > > | > > | > > class Child(SaBaseClass): > > > > parent_id = Column(Integer, index=True, nullable=True) > > > > parent = relationship('Parent', > > primaryjoin='foreign(Child.parent_id) == Parent.id', lazy='joined', > > uselist=False, foreign_keys='Child.parent_id') > > > > class Parent(SaBaseClass): > > > > children = relationship('Child', primaryjoin='Child.parent_id == > > foreign(Parent.id), backref='children', cascade='all, delete-orphan', > > uselist=True, lazy='joined', single_parent=True) > > | > > > > | > > > the first problem is that you are mixing up your foreign() directives on > your two relationships. foreign() indicates the column(s) that would > behave as though they have FOREIGN KEY CONSTRAINT placed upon them, > which note is optional, foreign() is all you need. In this case the > values for foreign() are contradictory and it seems that Child.parent_id > is your foreign() here. > > Next, these relationships are bi-directional with each other. They > would be linked together using back_populates. The ORM makes great use > of this clue to know that Child.parent and Parent.children are related > to each other and it can help in a lot of situations. There seems to be > some misunderstood use of the "backref" directive here too with > "Parent.children" having a backref to..."Child.children", which makes no > sense, we will take that out. > > Next is that single_parent=True makes no sense here, it should not be > needed; people use it because they saw the error/warning indicating it > should be used, which in this case you probably saw this error due to > the mis-placed foreign() directive, so we will take that out. > > We can make your example look exactly like that at > > http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-many, > > > the only change is that instead of using ForeignKey(), we use foreign() > in the primary join. Everything then works out great, see below. > > > from sqlalchemy import * > from sqlalchemy.orm import * > from sqlalchemy.ext.declarative import declarative_base > > Base = declarative_base() > > > class Child(Base): > __tablename__ = 'child' > id = Column(Integer, primary_key=True) > > parent_id = Column(Integer, index=True, nullable=True) > > parent = relationship( > 'Parent', > primaryjoin='foreign(Child.parent_id) == Parent.id', > lazy='joined', back_populates="children") > > > class Parent(Base): > __tablename__ = 'parent' > id = Column(Integer, primary_key=True) > > children = relationship( > 'Child', primaryjoin="foreign(Child.parent_id) == Parent.id", > cascade='all, delete-orphan', lazy='joined', > back_populates="parent") > > e = create_engine("postgresql://scott:tiger@localhost/test", echo=True) > Base.metadata.create_all(e) > s = Session(e) > > p1 = Parent() > c1 = Child() > p1.children.append(c1) > s.add_all([p1, c1]) > s.commit() > > s.delete(c1) > s.commit() > > assert p1.children == [] > > > > > > > > > So a child is linked to only one parent, and a parent can be linked to > > several children, and when I delete a Child instance I would like to > > "unlink" it from its Parent. When trying to delete a child instance I > > get "Dependency rule tried to blank-out primary key column parent.id on > > instance 'ParentA', which makes me think it's trying to delete Parent > > instance... > > > > > > > > If someone has a clue of what's wrong with my definition of the > > relationship, thanks in advance for your help ! > > > > Isabelle > > > > -- > > 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] <javascript:> > > <mailto:[email protected] <javascript:>>. > > To post to this group, send email to [email protected] > <javascript:> > > <mailto:[email protected] <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 [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.
