【问题标题】:Conflicts with relationship between tables表之间的关系冲突
【发布时间】:2021-07-10 21:32:48
【问题描述】:

我一直在控制台上收到警告,我读了这么多书让我发疯了,但我无法解决这个问题:

SAWarning:关系“Book.users”会将列 user.uid 复制到列 user_book.uid,这与关系冲突:“User.books”(将 user.uid 复制到 user_book.uid)。如果这不是故意的,请考虑这些关系是否应该与 back_populates 链接,或者如果 viewonly=True 应该应用于一个或多个,如果它们是只读的。对于外键约束部分重叠的不太常见的情况,可以使用 orm.foreign() 注释来隔离应该写入的列。 'overlaps' 参数可用于移除此警告。

控制台在本通知中引用的表格如下:

user_book = db.Table('user_book',
                     db.Column('uid', db.Integer, db.ForeignKey('user.uid'), primary_key=True),
                     db.Column('bid', db.Text, db.ForeignKey('book.bid'), primary_key=True),
                     db.Column('date_added', db.DateTime(timezone=True), server_default=db.func.now())
                     )


class User(db.Model):
    __tablename__ = 'user'

    uid = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(25), nullable=False)
    hash = db.Column(db.String(), nullable=False)
    first_name = db.Column(db.String(30), nullable=True)
    last_name = db.Column(db.String(80), nullable=True)
    books = db.relationship('Book', secondary=user_book)

class Book(db.Model):
    __tablename__ = 'book'

    bid = db.Column(db.Text, primary_key=True)
    title = db.Column(db.Text, nullable=False)
    authors = db.Column(db.Text, nullable=False)
    thumbnail = db.Column(db.Text, nullable=True)
    users = db.relationship('User', secondary=user_book)

我使用user_book table 向用户展示他添加的书籍。

我错过了什么?借此机会问一下,从语义上来说,表和外键的关系是不是做对了?

【问题讨论】:

  • 这更多的是关于ORM及其实现的问题,dba.se更适合关于数据库本身的Qs。您可能会在 SO 上获得更多运气。

标签: postgresql python sqlalchemy


【解决方案1】:

正如警告消息所示,您的关系中缺少back_populates= 属性:

class User(db.Model):
# …
    books = db.relationship('Book', secondary=user_book, back_populates="users")
# …
    
class Book(db.Model):
# …
    users = db.relationship('User', secondary=user_book, back_populates="books")
# …

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 2022-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    相关资源
    最近更新 更多