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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top