如何修复烧瓶中的sqlalchemy.exc.NoForeignKeysError?

时间:2019-07-26 20:12:35

标签: python flask sqlalchemy

我遇到此错误:

  

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)

1 个答案:

答案 0 :(得分:0)

从以下错误消息中:

  
    

...没有通过外部表'user'链接这些表的外键...

  

我们了解到该错误可能是在辅助表的设置中发生的。根据{{​​3}}:

  
    

在构造联接时,relationship()的默认行为是,它使一侧的主键列的值等于另一侧的外键引用列的值。我们可以使用primaryjoin参数将这个条件更改为我们想要的任何值,在使用“ secondary”表的情况下也可以使用secondaryjoin参数。

  

因此,并假设您在UserCar之间具有一对多一对一关系,您似乎不需要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")