将外键设置为nullable = false?

时间:2016-09-09 21:11:36

标签: python sqlalchemy foreign-keys

如果总是期望数据库中该列的外键,您是否将外键设置为nullable=false

我使用sqlalchemy并使用所需的外键设置我的模型。这有时会导致我更频繁地运行session.commit(),因为我需要父模型具有id并完全创建以便在ORM中构建子对象。什么是最佳做法?我的模型如下:

class Location(Base):
    __tablename__ = 'locations'

    id = Column(Integer, primary_key=True)
    city = Column(String(50), nullable=False, unique=True)

    hotels = relationship('Hotel', back_populates='location')


class Hotel(Base):
    __tablename__ = 'hotels'

    id = Column(Integer, primary_key=True)
    name = Column(String(100), nullable=False, unique=True)
    phone_number = Column(String(20))
    parking_fee = Column(String(10))
    location_id = Column(Integer, ForeignKey('locations.id'), nullable=False)

    location = relationship('Location', back_populates='hotels')

2 个答案:

答案 0 :(得分:2)

您无需session.commit()来获取ID; session.flush()会这样做。

更好的是,如果您设置关系,则根本不需要获取ID,因为SQLalchemy将确定执行INSERT的顺序。您可以这样做:

loc = Location(city="NYC", hotels=[Hotel(name="Hilton")])
session.add(loc)
session.commit()

它会正常工作。

答案 1 :(得分:0)

我建议你最好不要设置nullable = False。在很多情况下使外键可空可以很合理。例如,在您的方案中,如果我要插入当前位置不确定的酒店,则无法使用外键非空来完成此操作。因此,使用外键时的最佳做法是将其设置为可空。

查看必要的可以为空的外键Any example of a necessary nullable foreign key?