SQLAlchemy 引发具有多对一关系的 NoForeignKeyError

SQLAlchemy raises NoForeignKeyError with Many to One relations

我有三个不同的 类 我想使用 SQLAlchemy 与我的数据库集成。我的关系就像 Class2 object are main 类,每个 Class2 可以有多个 Class1 对象,Class1 应该与 Class2。每个 Class3 与类型 Class1.

的两个不同 类 有两个一对一关系
import sqlalchemy as db
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.orm import sessionmaker

Base = declarative_base()


class Class1(Base):
    __tablename__ = 'Class1s'
    id = Column(Integer, primary_key=True)
    owner = relationship("Class2", back_populates="Class1s")

    crypto_type = Column(String)
    balance = Column(Integer, primary_key=True, default=0)



class Class2(Base):
    __tablename__ = 'Class2s'

    id = Column(Integer, primary_key=True)



class Class3(Base):
    __tablename__ = 'Class3'

    id = Column(Integer, primary_key=True)
    amount = Column(Integer)

    source = relationship("Class1")
    destination = relationship("Class1")


class Database:
    def __init__(self):
        self.engine = db.create_engine("sqlite:///database.db", echo=True)

        session = sessionmaker()
        session.configure(bind=self.engine)
        Base.metadata.create_all(self.engine)


if __name__ == '__main__':
    db = Database()
    print('Database Initialized Successfully!')

    user = Class2()

这会引发以下错误:

sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Class1.owner - there are no foreign keys linking these tables.  Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.

请阅读Basic Relationship Patters

您确实需要定义 类 下的表是如何链接的,这是使用 ForeignKey

class Class1(Base):
    __tablename__ = 'Class1s'
    id = Column(Integer, primary_key=True)
    owner = relationship("Class2", back_populates="Class1s")

    crypto_type = Column(String)
    balance = Column(Integer, primary_key=True, default=0)



class Class2(Base):
    __tablename__ = 'Class2s'

    id = Column(Integer, primary_key=True)
    class1_id = Column(ForeignKey('Class1s.id'))  # <!-- NEW **
    # Class1s = relationship("Class2", back_populates="owner")

在您的情况下,您还需要在定义 Class3 和 Class1(我猜是 Transaction 和 TransactionLeg)之间的关系时明确说明。 有关详细信息,请参阅 Handling Multiple Join Paths

class Class3(Base):
    __tablename__ = 'Class3'

    id = Column(Integer, primary_key=True)
    amount = Column(Integer)

    source_id = Column(ForeignKey('Class2s.id'))  # <!-- NEW **
    destination_id = Column(ForeignKey('Class2s.id'))  # <!-- NEW **

    source = relationship("Class1", foreign_keys=[source_id])  # <!-- MODIFIED **
    destination = relationship("Class1",  foreign_keys=[destination_id])  # <!-- MODIFIED **

请注意,以上内容均未经过测试,可能包含拼写错误。