2016-09-09 10 views
1

Setzen Sie Ihre Fremdschlüssel als nullable = false, wenn Sie immer einen Fremdschlüssel für diese Spalte in der Datenbank erwarten?Fremdschlüssel auf Null setzen = false?

Ich benutze sqlalchemy und habe meine Modelle mit erforderlichen Fremdschlüsseln eingestellt. Dies führt manchmal dazu, dass ich session.commit() häufiger ausführen muss, da das Elternmodell eine ID haben muss und vollständig erstellt werden muss, um ein untergeordnetes Objekt im ORM zu erstellen. Was gilt als Best Practice? Meine Modelle sind unten:

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') 

Antwort

2

Sie brauchen nicht session.commit() zu tun, um eine ID zu erhalten; session.flush() wird tun.

Noch besser ist, Sie müssen nicht überhaupt eine ID zu erhalten, wenn Sie die Beziehung festgelegt, da sqlalchemy den Auftrag herauszufinden, in die INSERT s zu tun, können Sie einfach tun:.

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

und es wird gut funktionieren.

+0

Danke. Ich habe meinen Code umstrukturiert und konnte die session.commit() entfernen, während ich den erforderlichen Fremdschlüssel beibehielt. – Casey

0

Ich würde vorschlagen, dass Sie besser nicht Nullable = False setzen. In vielen Situationen ist die Verwendung von Fremdschlüssel-Nullwerten sehr sinnvoll. Wenn Sie in Ihrem Szenario beispielsweise ein Hotel einfügen möchten, dessen Standort derzeit unterbestimmt ist, können Sie dies nicht mit dem Fremdschlüssel nicht null erreichen. Wenn Sie also einen Fremdschlüssel verwenden, empfiehlt es sich, ihn auf Null zu setzen.

Siehe erforderlichen Nullable Fremdschlüssel Any example of a necessary nullable foreign key?

Verwandte Themen