2016-09-09 3 views
1

データベースのその列に常に外部キーがあると想定すると、外部キーをnullable = falseに設定していますか?外部キーをnullable = falseに設定しますか?

私はsqlalchemyを使用しており、必要な外部キーを使用してモデルを設定しています。これは、親モデルにIDを持たせ、子オブジェクトをORMに構築するために完全に作成する必要があるため、session.commit()を頻繁に実行することがあります。ベストプラクティスとは何ですか?私のモデルは以下の通りです:

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

IDを取得するのに、session.commit()を行う必要はありません。 session.flush()となります。さらに良い

あなたが関係を設定した場合、SQLAlchemyのは中INSERT秒を行うために把握されますので、あなたは、すべてのIDを取得する必要はありませんあなたが簡単に行うことができます。

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

とそれは正常に動作します。

+0

ありがとうございました。私は自分のコードをリファクタリングし、必要な外部キーを維持しながらsession.commit()を削除することができました。 – Casey

0

nullable = Falseを設定しない方がよいでしょう。外部キーをNULLにすることは、多くの状況で非常に合理的です。あなたのシナリオでは、たとえば、現在位置が未定のホテルを挿入したい場合、null以外の外部キーでこれを達成することはできません。したがって、外部キーを使用する場合のベストプラクティスは、NULLをNULLに設定できるようにすることです。

null可能な外部キーを参照してください。Any example of a necessary nullable foreign key?

関連する問題