Hi,
I've been playing with the Many-to-Many relationship
<http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#many-to-many>
from
the documentation. Suppose I have a student and teacher and would like to
define a bidirectional “favorite” relationship between the two, i.e. if a
student is a favorite of a teacher then the teacher is also a favorite of
that student:
favorite_association_table = Table("favorite_associations", Base.metadata,
Column("student_id", Integer, ForeignKey("students.id"),
nullable=False),
Column("teacher_id", Integer, ForeignKey("teachers.id"),
nullable=False),
)
and in the Teacher class:
favs = relationship("Student", secondary=favorite_association_table,
backref="favs")
Now I observe the following:
>>> teacher.favs
[]
>>> student.favs
[]
>>> student.favs.append(teacher)
>>> teacher.favs.append(student)
which creates two entries in the association table:
mysql> select * from favorite_associations;
+----------------------------------+----------------------------------+
| student_id | instructor_id |
+----------------------------------+----------------------------------+
| 030ced9060d2460fa30936cffd2e0a0a | 08315ae48d574bc3ac29526c675e67fc |
| 030ced9060d2460fa30936cffd2e0a0a | 08315ae48d574bc3ac29526c675e67fc |
+----------------------------------+----------------------------------+
2 rows in set (0.00 sec)
That is probably alright, but not really desirable. Now, when I attempt to
delete either the student or the teacher from the other, I get an error:
>>> student.favs.remove(teacher)
[…]
sqlalchemy.orm.exc.StaleDataError: DELETE statement on table
'favorite_association' expected to delete 1 row(s); Only 2 were matched.
I guess I could avoid the list.remove() and build a query like:
delete from favorite_associations where student_id='...'
but that seems clumsy in the context of the ORM.
So my question is: what is the proper and recommended way of implementing
and handling such a bidirectional relationship?
Thank you!
Jens
--
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.