Suponha tabela tem três colunas: username
, password
eno_of_logins
.
Quando o usuário tenta fazer login, é verificada uma entrada com uma consulta como
user = User.query.filter_by(username=form.username.data).first()
Se a senha corresponder, ele prosseguirá. O que eu gostaria de fazer é contar quantas vezes o usuário efetuou login. Assim, sempre que ele efetua login com êxito, eu gostaria de incrementar o no_of_logins
campo e armazená-lo na tabela de usuários. Não sei como executar a consulta de atualização com o SqlAlchemy.
python
sqlalchemy
flask-sqlalchemy
webminal.org
fonte
fonte
user.no_of_logins += 1
pode criar condições de corrida. Em vez disso, useuser.no_of_logins = user.no_of_logins + 1
. Traduzido para sql a maneira correta última torna-se:SET no_of_logins = no_of_logins + 1
.user.no_of_logins = User.no_of_logins + 1
, ou em outras palavras, use o atributo instrumentado do modelo para produzir uma expressão SQL. Como é o seu comentário, exibe duas maneiras de produzir a mesma condição de corrida.Existem várias maneiras de
UPDATE
usarsqlalchemy
fonte
setattr(query_result, key, value)
para algumas atualizações no Flask SQLAlchemy, seguidas por uma confirmação. Algum motivo para descontar esse padrão?setattr(query_result, key, value)
, que é exatamente equivalente à escritaquery_result.key = value
Exemplos para esclarecer a questão importante nos comentários da resposta aceita
Eu não entendi até brincar comigo mesma, então imaginei que haveria outros que também estavam confusos. Digamos que você esteja trabalhando no usuário de quem
id == 6
e de quemno_of_logins == 30
quando iniciar.O ponto
Ao referenciar a classe em vez da instância, você pode fazer com que o SQLAlchemy seja mais inteligente em incrementar, fazendo com que isso aconteça no lado do banco de dados e não no lado do Python. Fazê-lo no banco de dados é melhor, pois é menos vulnerável à corrupção de dados (por exemplo, dois clientes tentam incrementar ao mesmo tempo com um resultado líquido de apenas um incremento em vez de dois). Presumo que seja possível fazer o incremento no Python se você definir bloqueios ou aumentar o nível de isolamento, mas por que se preocupar se não for necessário?
Uma ressalva
Se você pretende incrementar duas vezes por meio de um código que produz SQL
SET no_of_logins = no_of_logins + 1
, precisará confirmar ou, pelo menos, liberar entre os incrementos; caso contrário, você receberá apenas um incremento no total:fonte
Com a ajuda de
user=User.query.filter_by(username=form.username.data).first()
instrução, você obterá o usuário especificado emuser
variávelAgora você pode alterar o valor da nova variável de objeto
user.no_of_logins += 1
e salvar as alterações com osession
método de confirmação do.fonte
Eu escrevi bot de telegrama e tenho algum problema com as linhas de atualização. Use este exemplo, se você tiver Model
Por que usar
db.session.flush()
? É por isso que >>> SQLAlchemy: Qual é a diferença entre flush () e commit ()?fonte
flush()
é sempre chamado como parte de uma chamada paracommit()
"