ich habe ein kleines Verständnisproblem. Im nachfolgenden Beispiel werden Änderungen, Einträge und Löschungen mit commit() durchgeführt. In manchen Übungen werden zum Beispiel bei Eintragungen oder Änderungen immer ein add() vor dem commit() gesetzt. Das nachfolgende Beispiel scheint jedoch auch ohne add() aus zukommen - zumindest bei Änderung von Datensätzen. Ich habe mir dazu einiges gelesen und bin hier: SQLAlchemy: What's the difference between flush() and commit()? stehen geblieben. Wenn ich also recht verstehe, registriert das Session-Objekt mittels der Operation add() nur die Transaktion, aber kommuniziert keineswegs mit der Datenbank? Das heißt, es muss entweder ein flush() oder ein commit() folgen? Aber dann bin ich noch mehr verwirrt. Ich habe auf meinem System den nachfolgenden Quelltext einfach mal das commit() bei Löschungen, Änderungen und Eintragungen auskommentiert und nur add() und delete() durchgeführt. Die Datensätze wurden trotzdem erfolgreich in der Datenbank gespeichert oder wurden erfolgreich aus der Datenbank gelöscht. Mit dieser Verwirrung wende ich mich an euch. Kann mir da jemand etwas mehr Licht in die Runde bringen? Mir geht es dabei um die Frage, ob ich dabei Gefahr laufe, wenn ich zum Beispiel nur add() / delete() oder nur commit() benutze? Denn ich verstehe nun nicht, weshalb ich beides benutzen sollte, wenn doch eines von beiden ihre Aufgabe erledigt? Selbst beim Löschen kann ich auf einen commit() verzichten.
Code: Alles auswählen
from sqlalchemy import create_engine
from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
db_string = "postgres://admin:donotusethispassword@aws-us-east-1-portal.19.dblayer.com:15813/compose"
db = create_engine(db_string)
base = declarative_base()
class Film(base):
__tablename__ = 'films'
title = Column(String, primary_key=True)
director = Column(String)
year = Column(String)
Session = sessionmaker(db)
session = Session()
base.metadata.create_all(db)
# Create
doctor_strange = Film(title="Doctor Strange", director="Scott Derrickson", year="2016")
#session.add(doctor_strange)
session.commit()
# Read
films = session.query(Film)
for film in films:
print(film.title)
# Update
doctor_strange.title = "Some2016Film"
#session.add(doctor_strange)
session.commit()
# Delete
session.delete(doctor_strange)
session.commit()