2009-09-07 5 views
2

J'ai des problèmes avec MySQL ou Python et je n'arrive pas à isoler le problème. INSERT s semblent seulement durer l'exécution du script et ne sont pas stockés dans la base de données.MySQL INSERT données ne sont pas stockées dans la bonne base de données, seulement temporaire?

J'ai ce script:

import MySQLdb 
db = MySQLdb.connect(host="localhost", user="user", passwd="password", db="example") 
dbcursor = db.cursor() 

dbcursor.execute("select * from tablename") 
temp = dbcursor.fetchall() 
print 'before: '+str(temp) 

dbcursor.execute('INSERT INTO tablename (data1, data2, data3) VALUES ("1", "a", "b")') 

dbcursor.execute("select * from tablename") 
temp = dbcursor.fetchall() 
print 'after: '+str(temp) 

La première fois que je le lance, je reçois le résultat attendu:

>>> 
before:() 
after: ((1L, 'a', 'b'),) 

Le problème est que si je le lance à nouveau, le before sort vide quand il devrait déjà avoir l'entrée dedans et l'après ne casse pas (la donnée 1 est la clé primaire).

>>> 
before:() 
after: ((1L, 'a', 'b'),) 
>>> 
before:() 
after: ((1L, 'a', 'b'),) 
>>> 
before:() 
after: ((1L, 'a', 'b'),) 

Si je tente d'exécuter la commande d'insertion deux fois dans le même script, il brisera (« entrée en double pour clé primaire »)

Toute idée de ce qui pourrait se produire ici?

Répondre

9

Vous ne commettez pas la transaction.

conn = MySQLdb.connect (host = "localhost", 
         user = "testuser", 
         passwd = "testpass", 
         db = "test") 
cursor = conn.cursor() 

cursor.execute(...) 
conn.commit() 

Reference

+0

Si elle est dans le DB, pourquoi le second retour de sélection de cette valeur? Est-ce la différence entre les DBs transactionnelles et non-transactionnelles? – greye

+0

@joaoc La seconde select renvoie la valeur car le résultat de l'INSERT est visible pour votre propre session, mais pas visible pour les autres jusqu'à ce que vous le validiez –

3

Je pense que vous devez appeler

db.commit()

+0

Après chaque dbcursor.execute ou une seule fois à la fin? – andrebruton

2

Le problème est que vous ne commettez pas les changements. il peut être fait par conn.commit()

en savoir plus sur ce here

Questions connexes