Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQLAlchemy circular dependency - how to solve it?

I have two tables, News and Files:

# unrelated columns removed
class News(db.Model): 
    id = db.Column(db.Integer, primary_key=True)
    file_id_logo = db.Column(db.Integer, db.ForeignKey('files.id'))
    logo = db.relationship('File', lazy=False)

class File(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    news_id = db.Column(db.Integer, db.ForeignKey('news.id'))
    news = db.relationship('News', lazy=False, backref=db.backref('files'))

After adding the file_id_logo fkey, SQLalchemy raised a CircularDependencyError. I've already tried post_update=True in the logo relation, but it did not change anything.

What's the proper way to solve this?

The following cases are possible (in case it matters):

  • A File has no or exactly one News assigned.
  • If a File has no News, there's also no News with this file referenced as its logo.
  • There can be multiple Files for a single News, but only one of these Files can be its logo.
  • So if a News has a logo, the referenced File also has this news as its news.
like image 502
ThiefMaster Avatar asked Apr 30 '11 18:04

ThiefMaster


People also ask

How do I ignore circular dependency?

The Mediator Pattern can also help to lift circular dependencies by encapsulating the bidirectional interaction of two or more objects. The downside of your current code is (besides the circular dependency), that whenever class A changes and also data persistence changes, you have to touch and modify class B.

What causes circular dependency?

A circular dependency occurs when two classes depend on each other. For example, class A needs class B, and class B also needs class A. Circular dependencies can arise in Nest between modules and between providers. While circular dependencies should be avoided where possible, you can't always do so.

What is circular dependency problem?

In software engineering, a circular dependency is a relation between two or more modules which either directly or indirectly depend on each other to function properly. Such modules are also known as mutually recursive.


1 Answers

use_alter – passed to the underlying ForeignKeyConstraint to indicate the constraint should be generated/dropped externally from the CREATE TABLE/ DROP TABLE statement. See that classes’ constructor for details.

https://docs.sqlalchemy.org/en/13/core/constraints.html#sqlalchemy.schema.ForeignKeyConstraint.params.use_alter

like image 106
sector119 Avatar answered Oct 09 '22 00:10

sector119