与表之间的关系冲突

问题描述

我一直在控制台上不断收到警告,我读了多少书都快疯了,但我一直没能解决这个问题:

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'),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用户展示他添加的书籍。

我错过了什么?借此机会问一下,表和外键的关系在语义上做对了吗?

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...