Como posso atualizar as informações de uma linha?
Por exemplo, eu gostaria de alterar a coluna de nome da linha que tem o id 5.
python
sqlalchemy
flask-sqlalchemy
Pocorschi
fonte
fonte
uesd_at = db.Column(db.DateTime)
que acabei de executar,obj.used_at = datetime.datetime.now()
db.session.commit()
mas não o valor definido para o campo.Há um método
update
no objeto BaseQuery em SQLAlchemy, que é retornado porfilter_by
.A vantagem de usar em
update
vez de alterar a entidade surge quando há muitos objetos a serem atualizados.Se você quiser dar
add_user
permissão a todos osadmin
s,Observe que
filter_by
leva argumentos de palavra-chave (use apenas um=
) em vez de usarfilter
uma expressão.fonte
admin
, o que pode ser enganoso, pois o resultado será o número de linhas atualizadas. Não é?User
itens afetados pela consulta, não o número de usuários afetados?Isso não funciona se você modificar um atributo em conserva do modelo. Os atributos conservados devem ser substituídos para acionar as atualizações:
fonte
data
e reatribuir.user.data = data
Apenas atribuir o valor e confirmá-los funcionará para todos os tipos de dados, exceto os atributos JSON e Pickled. Como o tipo em conserva é explicado acima, anotarei uma maneira um pouco diferente, mas fácil de atualizar JSONs.
Digamos que o modelo seja como o acima.
Isso adicionará o usuário ao banco de dados MySQL com os dados {"country": "Sri Lanka"}
A modificação de dados será ignorada. Meu código que não funcionou é o seguinte.
Em vez de passar pelo árduo trabalho de copiar o JSON para um novo dicionário (não atribuí-lo a uma nova variável como acima), o que deveria ter funcionado, encontrei uma maneira simples de fazer isso. Existe uma maneira de sinalizar o sistema que os JSONs mudaram.
A seguir está o código de trabalho.
Isso funcionou como um encanto. Há outro método proposto junto com este método aqui. Espero ter ajudado alguém.
fonte
db.session.merge(user)
adicionar este código funcionou para mim, FYI.