Banco de dados não é atualizada automaticamente com o MySQL e Python
-
23-08-2019 - |
Pergunta
Eu estou tendo alguns problemas atualizar uma linha em um banco de dados MySQL. Aqui está o código que eu estou tentando executar:
import MySQLdb
conn=MySQLdb.connect(host="localhost", user="root", passwd="pass", db="dbname")
cursor=conn.cursor()
cursor.execute("UPDATE compinfo SET Co_num=4 WHERE ID=100")
cursor.execute("SELECT Co_num FROM compinfo WHERE ID=100")
results = cursor.fetchall()
for row in results:
print row[0]
print "Number of rows updated: %d" % cursor.rowcount
cursor.close()
conn.close()
A saída eu recebo quando eu executar este programa é:
4
Número de linhas atualizadas: 1
Parece que ele está trabalhando, mas se eu consultar o banco de dados a partir da interface de linha de comando MySQL (CLI) Acho que não foi atualizado em tudo. No entanto, se a partir da CLI entro UPDATE compinfo SET Co_num=4 WHERE ID=100;
o banco de dados é atualizada conforme o esperado.
O que é o meu problema? Estou executando o Python 2.5.2 com o MySQL 5.1.30 em uma caixa de Windows.
Solução
Não estou certo, mas eu vou acho que você estiver usando uma tabela InnoDB, e você não tiver feito um commit. Acredito MySQLdb permitir transações automaticamente.
Chamada conn.commit()
antes close
chamando.
Desde o FAQ: começando com 1.2.0, MySQLdb desativa autocommit por padrão
Outras dicas
MySQLdb tem autocommit desativado por padrão, o que pode ser confuso no início. Sua conexão existe em sua própria transação e você não será capaz de ver as alterações feitas a partir de outras conexões até que você cometer essa transação.
Você pode fazer conn.commit()
após a instrução de atualização como outros já apontaram, ou desactivar esta funcionalidade completamente, definindo conn.autocommit(True)
direita depois de criar o objeto de conexão.
Você precisa confirmar as alterações manualmente ou virar de confirmação automática por diante.
A razão SELECT retorna o modificado (mas não persistentes) de dados é porque a conexão ainda está na mesma transação.
Eu encontrei esse conector do Python transforma automaticamente autocommit off, e não parece haver nenhuma maneira de mudar esse comportamento. Claro que você pode ligá-lo novamente, mas, em seguida, olhando para os logs de consulta, ele estupidamente faz duas consultas inúteis após Connect para activar a autocommit off, em seguida, novamente.