Frage

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 die Zahl erhöhen no_of_logins Feld und speichern Sie es zurück in der Benutzertabelle.Ich bin nicht sicher, wie ich eine Aktualisierungsabfrage mit SqlAlchemy ausführen soll.

War es hilfreich?

Lösung

user.no_of_logins += 1
session.commit()

Andere Tipps

Es gibt mehrere Möglichkeiten UPDATE verwenden sqlalchemy

1) user.no_of_logins += 1
   session.commit()

2) session.query().\
       filter(User.username == form.username.data).\
       update({"no_of_logins": (User.no_of_logins +1)})
   session.commit()

3) conn = engine.connect()
   stmt = User.update().\
       values(no_of_logins=(User.no_of_logins + 1)).\
       where(User.username == form.username.data)
   conn.execute(stmt)

4) setattr(user, 'no_of_logins', user.no_of_logins+1)
   session.commit()

Beispiele zur Verdeutlichung des wichtigen Problems in den Kommentaren akzeptierter Antworten

Ich habe es erst verstanden, als ich selbst damit herumgespielt habe, also ging ich davon aus, dass es auch andere geben würde, die verwirrt waren.Angenommen, Sie arbeiten an dem Benutzer, dessen id == 6 und wessen no_of_logins == 30 wenn du anfängst.

# 1 (bad)
user.no_of_logins += 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 2 (bad)
user.no_of_logins = user.no_of_logins + 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 3 (bad)
setattr(user, 'no_of_logins', user.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 4 (ok)
user.no_of_logins = User.no_of_logins + 1
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

# 5 (ok)
setattr(user, 'no_of_logins', User.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

Der Punkt

Indem Sie auf die Klasse statt auf die Instanz verweisen, können Sie SQLAlchemy dazu bringen, die Inkrementierung intelligenter zu gestalten und sie auf der Datenbankseite statt auf der Python-Seite durchzuführen.Es ist besser, dies innerhalb der Datenbank zu tun, da diese weniger anfällig für Datenbeschädigungen ist (z. B.zwei Clients versuchen gleichzeitig eine Inkrementierung vorzunehmen, mit einem Nettoergebnis von nur einer Inkrementierung statt zwei).Ich gehe davon aus, dass es möglich ist, die Inkrementierung in Python durchzuführen, wenn Sie Sperren setzen oder die Isolationsstufe erhöhen, aber warum sollten Sie sich die Mühe machen, wenn Sie es nicht müssen?

Eine Einschränkung

Wenn Sie über Code, der SQL-ähnliche Ergebnisse erzeugt, zweimal inkrementieren möchten SET no_of_logins = no_of_logins + 1, dann müssen Sie zwischen den Inkrementen einen Commit durchführen oder zumindest einen Flush durchführen, andernfalls erhalten Sie insgesamt nur ein Inkrement:

# 6 (bad)
user.no_of_logins = User.no_of_logins + 1
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

# 7 (ok)
user.no_of_logins = User.no_of_logins + 1
session.flush()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

Mit der Hilfe von user=User.query.filter_by(username=form.username.data).first() Anweisung erhalten Sie den angegebenen Benutzer user Variable.

Jetzt können Sie den Wert der neuen Objektvariablen wie folgt ändern user.no_of_logins += 1 und speichern Sie die Änderungen mit session's Commit-Methode.

Ich habe einen Telegram-Bot geschrieben und habe ein Problem mit der Aktualisierung von Zeilen.Verwenden Sie dieses Beispiel, wenn Sie Model haben

def update_state(chat_id, state):
    try:
        value = Users.query.filter(Users.chat_id == str(chat_id)).first()
        value.state = str(state)
        db.session.flush()
        db.session.commit()
        #db.session.close()
    except:
        print('Error in def update_state')

Warum verwenden db.session.flush()?Deshalb >>> SQLAlchemy:Was ist der Unterschied zwischen Flush() und Commit()?

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