Adding a bunch of 'overlaps' remove the warnings , is this the right way?
class Xs(ModelBase):
id = Column(Integer, primary_key=True)
ys = relationship('Ys', secondary='test.xy_assoc', back_populates='xs',
overlaps='xy_assocs')
xy_assocs = relationship('XY_assoc', back_populates='x', overlaps='ys')
class Ys(ModelBase):
id = Column(Integer, primary_key=True)
xs = relationship('Xs', secondary='test.xy_assoc', back_populates='ys',
overlaps='xy_assocs')
xy_assocs = relationship('XY_assoc', back_populates='y', overlaps='xs')
class XY_assoc(ModelBase):
x_id = Column(Integer, ForeignKey(Xs.id), primary_key=True)
y_id = Column(Integer, ForeignKey(Ys.id), primary_key=True)
x = relationship('Xs', back_populates='xy_assocs', overlaps='xs,ys')
y = relationship('Ys', back_populates='xy_assocs', overlaps='xs,ys')
On Sunday, June 5, 2022 at 3:20:23 PM UTC-7 Sanchay wrote:
> Suppose I have the standard M:N association table pattern, like so
>
> class Xs(ModelBase):
> id = Column(Integer, primary_key=True)
>
> ys = relationship('Ys', secondary='test.xy_assoc', back_populates='xs')
>
> class Ys(ModelBase):
> id = Column(Integer, primary_key=True)
>
> xs = relationship('Xs', secondary='test.xy_assoc', back_populates='ys')
>
> class XY_assoc(ModelBase):
> x_id = Column(Integer, ForeignKey(Xs.id), primary_key=True)
> y_id = Column(Integer, ForeignKey(Ys.id), primary_key=True)
>
> Everything is fine and works. But now I want to add a few extra
> relationships to the association table itself:
>
> class Xs(ModelBase):
> id = Column(Integer, primary_key=True)
>
> ys = relationship('Ys', secondary='test.xy_assoc', back_populates='xs')
> xy_assocs = relationship('XY_assoc', back_populates='x')
>
> class Ys(ModelBase):
> id = Column(Integer, primary_key=True)
>
> xs = relationship('Xs', secondary='test.xy_assoc', back_populates='ys')
> xy_assocs = relationship('XY_assoc', back_populates='y')
>
> class XY_assoc(ModelBase):
> x_id = Column(Integer, ForeignKey(Xs.id), primary_key=True)
> y_id = Column(Integer, ForeignKey(Ys.id), primary_key=True)
>
> x = relationship('Xs', back_populates='xy_assocs')
> y = relationship('Ys', back_populates='xy_assocs')
>
> With this, I get the following SQLA warnings. What is the right way to
> achieve this?
>
> /var/folders/lk/x4t5tp_n28qgpyp14fr6r5700000gn/T/ipykernel_74888/982636505.py:2:
>
> SAWarning: relationship 'Xs.xy_assocs' will copy column xs.id to column
> xy_assoc.x_id, which conflicts with relationship(s): 'Xs.ys' (copies xs.id
> to xy_assoc.x_id). If this is not the intention, consider if these
> relationships should be linked with back_populates, or if viewonly=True
> should be applied to one or more if they are read-only. For the less common
> case that foreign key constraints are partially overlapping, the
> orm.foreign() annotation can be used to isolate the columns that should be
> written towards. To silence this warning, add the parameter 'overlaps="ys"'
> to the 'Xs.xy_assocs' relationship. xs = session.query(Xs).all()
> /var/folders/lk/x4t5tp_n28qgpyp14fr6r5700000gn/T/ipykernel_74888/982636505.py:2:
>
> SAWarning: relationship 'Ys.xs' will copy column xs.id to column
> xy_assoc.x_id, which conflicts with relationship(s): 'Xs.xy_assocs' (copies
> xs.id to xy_assoc.x_id). If this is not the intention, consider if these
> relationships should be linked with back_populates, or if viewonly=True
> should be applied to one or more if they are read-only. For the less common
> case that foreign key constraints are partially overlapping, the
> orm.foreign() annotation can be used to isolate the columns that should be
> written towards. To silence this warning, add the parameter
> 'overlaps="xy_assocs"' to the 'Ys.xs' relationship. xs =
> session.query(Xs).all()
> /var/folders/lk/x4t5tp_n28qgpyp14fr6r5700000gn/T/ipykernel_74888/982636505.py:2:
>
> SAWarning: relationship 'Ys.xy_assocs' will copy column ys.id to column
> xy_assoc.y_id, which conflicts with relationship(s): 'Xs.ys' (copies ys.id
> to xy_assoc.y_id), 'Ys.xs' (copies ys.id to xy_assoc.y_id). If this is
> not the intention, consider if these relationships should be linked with
> back_populates, or if viewonly=True should be applied to one or more if
> they are read-only. For the less common case that foreign key constraints
> are partially overlapping, the orm.foreign() annotation can be used to
> isolate the columns that should be written towards. To silence this
> warning, add the parameter 'overlaps="xs,ys"' to the 'Ys.xy_assocs'
> relationship. xs = session.query(Xs).all()
> /var/folders/lk/x4t5tp_n28qgpyp14fr6r5700000gn/T/ipykernel_74888/982636505.py:2:
>
> SAWarning: relationship 'XY_assoc.x' will copy column xs.id to column
> xy_assoc.x_id, which conflicts with relationship(s): 'Xs.ys' (copies xs.id
> to xy_assoc.x_id), 'Ys.xs' (copies xs.id to xy_assoc.x_id). If this is
> not the intention, consider if these relationships should be linked with
> back_populates, or if viewonly=True should be applied to one or more if
> they are read-only. For the less common case that foreign key constraints
> are partially overlapping, the orm.foreign() annotation can be used to
> isolate the columns that should be written towards. To silence this
> warning, add the parameter 'overlaps="xs,ys"' to the 'XY_assoc.x'
> relationship. xs = session.query(Xs).all()
> /var/folders/lk/x4t5tp_n28qgpyp14fr6r5700000gn/T/ipykernel_74888/982636505.py:2:
>
> SAWarning: relationship 'XY_assoc.y' will copy column ys.id to column
> xy_assoc.y_id, which conflicts with relationship(s): 'Xs.ys' (copies ys.id
> to xy_assoc.y_id), 'Ys.xs' (copies ys.id to xy_assoc.y_id). If this is
> not the intention, consider if these relationships should be linked with
> back_populates, or if viewonly=True should be applied to one or more if
> they are read-only. For the less common case that foreign key constraints
> are partially overlapping, the orm.foreign() annotation can be used to
> isolate the columns that should be written towards. To silence this
> warning, add the parameter 'overlaps="xs,ys"' to the 'XY_assoc.y'
> relationship. xs = session.query(Xs).all()
>
>
--
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 view this discussion on the web visit
https://groups.google.com/d/msgid/sqlalchemy/e203b224-e662-4673-a47d-f10b73e3d579n%40googlegroups.com.