Python sqlalchemy关系一对一数据重复

Python sqlalchemy关系一对一数据重复,python,sqlalchemy,flask-sqlalchemy,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 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)
上面是两个模型,然后我们在数据库中插入一些数据以便于测试, A:

B:

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

a_list = db.session.query(A).all()
for a in a_list:
    print(a.b.source_id)
根据常识,只有21YY输出一次,因为它们是一对一的关系,并且源_id用于关联,但结果是输出“21YY”三次。此结果需要您帮助我理解,我将不胜感激。

尝试用
A.source\u id==foreign(B.source\u id)
替换
A.source\u id==foreign(B.source\u id)
。对我有用

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

请参见此示例:

对于您的模式,它将如下所示:

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)
a_list = db.session.query(A).all()
for a in a_list:
    print(a.b.source_id)
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)