Angenommen, die Tabelle hat drei Spalten : username
, password
und no_of_logins
.
Wenn der Benutzer versucht, sich anzumelden, wird nach einem Eintrag mit einer Abfrage wie gesucht
user = User.query.filter_by(username=form.username.data).first()
Wenn das Passwort übereinstimmt, fährt er fort. Ich möchte zählen, wie oft sich der Benutzer angemeldet hat. Wenn er sich also erfolgreich anmeldet, möchte ich das no_of_logins
Feld erhöhen und in der Benutzertabelle speichern. Ich bin nicht sicher, wie ich die Update-Abfrage mit SqlAlchemy ausführen soll.
python
sqlalchemy
flask-sqlalchemy
webminal.org
quelle
quelle
user.no_of_logins += 1
Kann laut Endolithen-Link Rennbedingungen schaffen. Verwenden Sie stattdessenuser.no_of_logins = user.no_of_logins + 1
. In SQL übersetzt wird der letztere richtige Weg :SET no_of_logins = no_of_logins + 1
.user.no_of_logins = User.no_of_logins + 1
, oder verwenden Sie mit anderen Worten das instrumentierte Attribut des Modells, um einen SQL-Ausdruck zu erzeugen. Wie es ist, zeigt Ihr Kommentar zwei Möglichkeiten, um die gleiche Rennbedingung zu erzeugen.Es gibt verschiedene Möglichkeiten zur
UPDATE
Verwendungsqlalchemy
quelle
setattr(query_result, key, value)
für einige Updates in Flask SQLAlchemy, gefolgt von einem Commit. Gibt es einen Grund, dieses Muster abzuwerten?setattr(query_result, key, value)
, was genau gleichbedeutend mit Schreiben istquery_result.key = value
Beispiele zur Klärung des wichtigen Problems in den Kommentaren der akzeptierten Antwort
Ich habe es nicht verstanden, bis ich selbst damit herumgespielt habe, also dachte ich, dass es auch andere geben würde, die verwirrt waren. Angenommen, Sie arbeiten an dem Benutzer, dessen
id == 6
und dessenno_of_logins == 30
beim Start.Der Punkt
Indem Sie auf die Klasse anstelle der Instanz verweisen, können Sie SQLAlchemy beim Inkrementieren intelligenter machen und dies auf der Datenbankseite anstelle der Python-Seite veranlassen. Dies in der Datenbank zu tun ist besser, da es weniger anfällig für Datenbeschädigungen ist (z. B. versuchen zwei Clients gleichzeitig, mit einem Nettoergebnis von nur einem statt zwei Inkrementen zu erhöhen). Ich gehe davon aus, dass es möglich ist, das Inkrementieren in Python durchzuführen, wenn Sie Sperren setzen oder die Isolationsstufe erhöhen. Aber warum sollten Sie sich die Mühe machen, wenn Sie dies nicht müssen?
Eine Einschränkung
Wenn Sie zweimal über Code inkrementieren möchten, der SQL-ähnliche Effekte erzeugt
SET no_of_logins = no_of_logins + 1
, müssen Sie zwischen den Inkrementen ein Commit durchführen oder zumindest einen Flush durchführen. Andernfalls erhalten Sie insgesamt nur ein Inkrement:quelle
Mit Hilfe der
user=User.query.filter_by(username=form.username.data).first()
Anweisung erhalten Sie den angegebenen Benutzer inuser
Variable.Jetzt können Sie den Wert der neuen Objektvariablen wie ändern
user.no_of_logins += 1
und die Änderungen mit dersession
Festschreibungsmethode von ' speichern .quelle
Ich habe einen Telegramm-Bot geschrieben und habe ein Problem mit Update-Zeilen. Verwenden Sie dieses Beispiel, wenn Sie über Model verfügen
Warum verwenden
db.session.flush()
? Deshalb >>> SQLAlchemy: Was ist der Unterschied zwischen flush () und commit ()?quelle
flush()
commit()