Frage

In diesem Code wird die last_seen das Feld wird mit der aktuellen Uhrzeit aktualisiert, wenn der Benutzer die Site verwendet.Im Aufruf an die db fügt er (Minuel Grindberg "Flask Web Development") jedoch hinzu self statt self.last_seen, was mich verwirrt.Ich verstehe, was die Grundprinzipien von OOP sind, und ich (dachte) verstehe was self ist (Verweis auf das Objekt, das erstellt wird), aber ich verstehe NICHT, warum wir nicht hinzufügen self.last_seen in der letzten Zeile db.session.add(self)?Vollständiger Code unten...

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    password_hash = db.Column(db.String(128))
    confirmed = db.Column(db.Boolean, default=False)
    name = db.Column(db.String(64))
    location = db.Column(db.String(64))
    about_me = db.Column(db.Text())
    member_since = db.Column(db.DateTime(), default=datetime.utcnow)
    last_seen = db.Column(db.DateTime(), default=datetime.utcnow)

def ping(self):
    self.last_seen = datetime.utcnow()
    db.session.add(self)

Sieht sehr einfach aus und ich bin mir sicher, dass es so ist, aber offensichtlich fehlt mir etwas oder ich habe nichts gelernt, was ich hätte haben sollen.Wenn ich wüsste, was ich nach einer Antwort googeln soll, hätte ich das sicherlich getan, aber ich bin mir nicht einmal sicher, wonach ich suchen soll, außer nach den Prinzipien von Python OOP, von denen ich dachte, dass ich sie bereits verstanden habe (ich habe sie überprüft).Jede Hilfe wäre sehr dankbar, denn das macht mich verrückt, lol.

War es hilfreich?

Lösung

Er fügt der Datenbank das aktualisierte Modell hinzu.Das Modell hat sich so verändert db.session.add() aktualisiert die richtige Zeile hinter den Kulissen.Ich glaube nicht, dass SQLAlchemy es Ihnen erlauben würde, die Eigenschaft von model hinzuzufügen, da es nicht wissen würde, welche Zeile aktualisiert werden soll

Vielleicht würde ein Beispiel dies klarer machen.Nehmen wir das folgende Modell:

class User(db.model):
    __tablename__ = 'User'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(25))

Jetzt gibt es 2 sehr wichtige Attribute für das Modell zum Einfügen / Aktualisieren in die Datenbank.Der Tabellenname und die ID.Um dieses Modell mit einfachem SQL zur Datenbank hinzuzufügen, müssten wir Folgendes tun:

INSERT INTO User (name) VALUES ('Some string');

Dies ist ungefähr das, was passiert, wenn Sie verwenden db.session.add() auf einem neuen Modell.Um unser Modell zu aktualisieren, müssten wir etwas tun wie:

UPDATE User
SET name='Some other String'
WHERE id=1;

Wenn Sie nun nur ein Attribut eines Modells an SQLAlchemy übergeben würden, wie könnte es herausfinden, zu welcher Tabelle Sie hinzufügen möchten oder welche Zeile geändert werden soll?Wenn du gerade bestanden hast self.name zu db.session.add() die Abfrage würde am Ende so aussehen:

UPDATE  # There is no way to know the table
SET name='Some other String'
WHERE  ; # There is no way to know which row needs to be changed

SQLAlchemy würde höchstwahrscheinlich eine Ausnahme auslösen, wenn Sie es versuchen würden.Warum es das Modell nicht ableiten kann self das liegt wahrscheinlich weit außerhalb des Rahmens einer SO-Frage.

Andere Tipps

IanAuld hat recht - aber ich werde mich bemühen, es langatmig zu erklären.

Versetzen wir uns in die Rolle von SQLAlchemy und tun wir so, als wären wir die db.session.add Methode.

self.last_seen ist ein datetime objekt, also tun wir so, als säßen wir zu Hause, und ein Umschlag kommt durch die Tür und ist adressiert an db.session.add.Großartig, das sind wir, also öffnen wir es und lesen die Nachricht, die nur sagt 2014-07-29 sonst nichts.Wir wissen, dass wir es irgendwo im Aktenschrank ablegen müssen, aber wir haben einfach nicht genug Informationen dafür, wir wissen nur, dass wir eine haben datetime, wir haben keine Ahnung was User es gehört dazu, oder auch wenn es zu einem gehört User überhaupt ist es nur ein datetime-- wir stecken fest.

Wenn stattdessen als nächstes ein Paket durch die Tür kommt, wieder adressiert an db.session.add, und wieder öffnen wir es - diesmal ist es ein kleines Modell eines User, es hat einen Namen, eine E-Mail - und sogar eine zuletzt gesehene Datums- / Uhrzeitangabe auf dem Arm.Jetzt ist es einfach - ich kann direkt zum Aktenschrank gehen und nachsehen, ob ich es schon da drin habe, und entweder ein paar Änderungen vornehmen, damit sie übereinstimmen, oder es einfach weglegen, wenn es neu ist.

Das ist der Unterschied - mit einem ORM-Modell geben Sie diese vollständigen Benutzer oder Produkte oder irgendetwas herum, und SQLAlchemy weiß, dass es ein ist db.Model und kann daher wissen, wie und wo man damit umgeht, indem man seine Details inspiziert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top