我遇到此错误:
sqlalchemy.exc.NoForeignKeysError:无法确定关系User.car的父/子表之间的联接条件-没有通过外部表“ user”链接这些表的外键。确保引用列与ForeignKey或ForeignKeyConstraint关联,或指定“ primaryjoin”和“ secondaryjoin”表达式。
127.0.0.1--[26 / Jul / 2019 23:05:40]“ GET / user HTTP / 1.1” 500-
以下是我的程序
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
user_id = Column(Integer)
passport_number = Column(String(8), nullable=False, primary_key=True)
user_email = Column(String(10), nullable=False)
user_name = Column(String(10), nullable=False)
car = relationship('Car', secondary='user')
class Car(Base):
__tablename__ = 'car'
car_number = Column(Integer, primary_key=True, nullable=False)
car_model = Column(String(10), nullable=False)
user_passport_number = Column(String(8), ForeignKey('user.passport_number'), primary_key=True)
part = relationship('Part', secondary='car')
class Part(Base):
__tablename__ = 'part'
part_name = Column(String(10), primary_key=True, nullable=False)
part_price = Column(Integer, nullable=False)
car_number = Column(Integer, ForeignKey('car.car_number'), primary_key=True)
答案 0 :(得分:0)
从以下错误消息中:
...没有通过外部表'user'链接这些表的外键...
我们了解到该错误可能是在辅助表的设置中发生的。根据{{3}}:
在构造联接时,relationship()的默认行为是,它使一侧的主键列的值等于另一侧的外键引用列的值。我们可以使用primaryjoin参数将这个条件更改为我们想要的任何值,在使用“ secondary”表的情况下也可以使用secondaryjoin参数。
因此,并假设您在User
和Car
之间具有一对多或一对一关系,您似乎不需要secondary
参数:
class User(Base):
__tablename__ = 'user'
user_id = Column(Integer)
passport_number = Column(String(8), nullable=False, primary_key=True)
user_email = Column(String(10), nullable=False)
user_name = Column(String(10), nullable=False)
car = relationship('Car', backref='User') #removed secondary relationship
另外,请注意,您正在将primary_key约束传递给外键字段,该字段仅在一对一关系中使用,以防万一。如果是这样,那么文档将显示一对一表的简单示例:
class User(Base):
__tablename__ = 'user'
passport_number = Column(String(8), nullable=False, primary_key=True)
car = relationship("Car", uselist=False, back_populates="car")
class Car(Base):
__tablename__ = 'car'
id = Column(Integer, primary_key=True)
user_passport_number = Column(String(8), ForeignKey('user.passport_number'))
user = relationship("User", back_populates="car")