sqlalchemy关系一对一数据重复

时间:2018-08-13 07:44:47

标签: python sqlalchemy flask-sqlalchemy

显示代码:

class A(db.Model):
__tablename__ = 'A'
id = db.Column(db.Integer, primary_key=True)
source_id = db.Column(db.String(30), nullable=False, unique=True)
b = relationship('B', primaryjoin='remote(A.source_id)==foreign(B.source_id)', uselist=False)

class B(db.Model):
__tablename__ = 'B'
id = db.Column(db.Integer, primary_key=True)
source_id = db.Column(db.String(30), nullable=False, unique=True)

上面是两个模型,然后我们在数据库中插入一些数据以方便测试, 答:

INSERT INTO public."A" (id, source_id) VALUES (1, '21YY');
INSERT INTO public."A" (id, source_id) VALUES (2, '22YY');
INSERT INTO public."A" (id, source_id) VALUES (3, '23YY');

B:

INSERT INTO public."B" (id, source_id) VALUES (1, '21YY');

现在我们已经成功插入了数据,然后我们进行查询

a_list = db.session.query(A).all()
for a in a_list:
    print(a.b.source_id)

根据常识,由于它们是一对一关系,所以仅输出一次21YY,因为source_id用于关联,但是结果输出“ 21YY”三次。此结果需要您帮助我理解,谢谢。

1 个答案:

答案 0 :(得分:0)

尝试将remote(A.source_id)==foreign(B.source_id)替换为A.source_id==foreign(B.source_id)。为我工作。

但是有一种更好的方法可以在SQLAlchemy中声明一对一关系。您可以在声明列时指定外键。然后,SQLAlchemy将知道如何加入,您只需指定关系即可。 primaryjoin仅应在特殊情况下使用,而您的问题不是一个。

请参见以下示例: http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-one

对于您的架构,应如下所示:

class A(db.Model):
    __tablename__ = "A"
    id = db.Column(db.Integer, primary_key=True)
    source_id = db.Column(db.String(30), db.ForeignKey("B.source_id"),
                          nullable=False, unique=True)
    b = relationship('B', uselist=False)


class B(db.Model):
    __tablename__ = "B"
    id = db.Column(db.Integer, primary_key=True)
    source_id = db.Column(db.String(30), nullable=False, unique=True)