Comment puis-je mettre à jour les informations d'une ligne?
Par exemple, je voudrais modifier la colonne de nom de la ligne qui a l'ID 5.
python
sqlalchemy
flask-sqlalchemy
pocorschi
la source
la source
uesd_at = db.Column(db.DateTime)
je viens de courirobj.used_at = datetime.datetime.now()
db.session.commit()
mais pas la valeur définie sur le champ.Il existe une méthode
update
sur l'objet BaseQuery dans SQLAlchemy, qui est renvoyée parfilter_by
.L'avantage d'utiliser par
update
rapport à la modification de l'entité survient lorsqu'il y a de nombreux objets à mettre à jour.Si vous voulez donner la
add_user
permission à tous lesadmin
s,Notez que
filter_by
prend des arguments de mot-clé (utilisez un seul=
) par opposition àfilter
qui prend une expression.la source
admin
, ce qui peut être trompeur car le résultat sera le nombre de lignes mises à jour. N'est-ce pas?User
éléments affectés par la requête, pas le nombre d'utilisateurs concernés?Cela ne fonctionne pas si vous modifiez un attribut décapé du modèle. Les attributs marinés doivent être remplacés pour déclencher des mises à jour:
la source
data
et le réaffecter.user.data = data
Le simple fait d'attribuer la valeur et de les valider fonctionnera pour tous les types de données à l'exception des attributs JSON et Pickled. Étant donné que le type pickled est expliqué ci-dessus, je noterai un moyen légèrement différent mais facile de mettre à jour les JSON.
Disons que le modèle est comme ci-dessus.
Cela ajoutera l'utilisateur dans la base de données MySQL avec les données {"country": "Sri Lanka"}
La modification des données sera ignorée. Mon code qui n'a pas fonctionné est le suivant.
Au lieu de passer par le travail pénible de copier le JSON dans un nouveau dict (ne pas l'assigner à une nouvelle variable comme ci-dessus), ce qui aurait dû fonctionner, j'ai trouvé un moyen simple de le faire. Il existe un moyen de signaler au système que les JSON ont changé.
Voici le code de travail.
Cela a fonctionné comme un charme. Il y a une autre méthode proposée avec cette méthode ici J'espère avoir aidé quelqu'un.
la source
db.session.merge(user)
l'ajout de ce code a fonctionné pour moi, FYI.