Jak mogę zaktualizować informacje w wierszu?
Na przykład chciałbym zmienić kolumnę nazwy w wierszu o identyfikatorze 5.
python
sqlalchemy
flask-sqlalchemy
pocorschi
źródło
źródło
uesd_at = db.Column(db.DateTime)
po prostu uruchomiona,obj.used_at = datetime.datetime.now()
db.session.commit()
ale nie wartość ustawiona na pole.W
update
obiekcie BaseQuery w SQLAlchemy istnieje metoda , która jest zwracana przezfilter_by
.Zaletą używania
update
nad zmianą jednostki jest sytuacja, gdy istnieje wiele obiektów do zaktualizowania.Jeśli chcesz
add_user
zezwolić wszystkimadmin
,Zauważ, że
filter_by
przyjmuje argumenty słów kluczowych (użyj tylko jednego=
), w przeciwieństwie do tego,filter
który przyjmuje wyrażenie.źródło
admin
, co może być mylące, ponieważ wynikiem będzie liczba zaktualizowanych wierszy. Prawda?User
elementy, których dotyczy zapytanie, a nie liczbę użytkowników, których dotyczy zapytanie?To nie zadziała, jeśli zmodyfikujesz marynowany atrybut modelu. Marynowane atrybuty należy wymienić, aby wywołać aktualizacje:
źródło
data
i przypisać.user.data = data
Samo przypisanie wartości i zatwierdzenie ich zadziała dla wszystkich typów danych oprócz atrybutów JSON i Pickled. Ponieważ typ marynowany jest wyjaśniony powyżej, zanotuję nieco inny, ale łatwy sposób aktualizacji JSON.
Powiedzmy, że model jest taki jak powyżej.
Spowoduje to dodanie użytkownika do bazy danych MySQL z danymi {"country": "Sri Lanka"}
Modyfikowanie danych zostanie zignorowane. Mój kod, który nie zadziałał, jest następujący.
Zamiast przechodzić przez bolesną pracę polegającą na kopiowaniu JSON do nowego dyktu (nie przypisując go do nowej zmiennej jak wyżej), co powinno zadziałać, znalazłem prosty sposób na zrobienie tego. Istnieje sposób na oznaczenie systemu, że zmieniły się JSON.
Poniżej znajduje się działający kod.
To zadziałało jak urok. Jest jeszcze inna metoda zaproponowana wraz z tej metody tutaj nadzieję, że pomogliśmy kogoś.
źródło
db.session.merge(user)
dodanie tego kodu zadziałało dla mnie, FYI.