2016-05-31 18 views
2

erster Beitrag; Mir wurde oft geholfen von den Fragen anderer, aber jetzt bin ich völlig festgefahren.python mysqldb Daten einfügen ohne Fehler verdampfen

Ich arbeite in Python, mit MySQLdb (im Folgenden als 'mysql' importiert) und versuche, eine Einfügung zu tun. Dieser Code, der mit seiner eigenen Verbindung zum Debuggen isoliert ist, folgt unmittelbar einem vollständig erfolgreichen Einfügen in eine andere Tabelle in derselben Datenbank, wobei dieselbe Verbindung (vor dem Debuggen) verwendet wird.

import MySQLdb as mysql 
    from futuremachine import data 

    j = {}; 

    return_id = 7201; 
    j['boxids'] = [u'28'] 

    ... 

    local_connection = data.environment('development'); 
    local_db = mysql.connect(**local_connection); 
    local_curs = local_db.cursor(); 
    if local_db.autocommit: 
    print "AUTOCOMMIT ON"; 
    else: 
    print "EUREKA"; 

    # insert the new set of labels 
    for label_id in j['boxids']: 
    query = """ 
    insert into eventlabels values (%s, %s) 
    """ 
    args = [int(return_id),int(label_id)] 

    try: 
     #local_curs.execute(query,args); 
     data.executive(local_curs,query,args); 
     #local_db.commit() 
    except mysql.Error, e: 
     sys.exit("sql error:\n" + query + "\n%s" % e); 

    ci = local_db.info() 
    rc = local_db.affected_rows() 
    print "info: "+str(ci); 
    print "affected: "+str(rc); 

    local_db.close(); 

die 'data.executive' ein Wrapper curs.execute; Ich habe dies mit und ohne Wrapper zum selben Ergebnis versucht. return_id ist die Lastrowid von der vorherigen Einfügung, die jedes Mal funktioniert; Dummy-Werte sind oben angegeben.

die info() gibt None zurück; noch frustrierender, affected_rows() liefert 1.

Die Abfrage erzeugt keine Fehler, aber wenn ich die Tabelle nach den eingefügten Daten überprüfe, ist sie nicht da.

  1. autocommit ist eingeschaltet; Aufruf commit() hat unmittelbar keine Auswirkung
  2. die Verbindungs ​​Benutzer überprüft Berechtigungen auf die Tabelle im System mysql.log
  3. die Abfrage erscheint

das alles ist, ich denke, dies umfassen kann einfügen hat Zeit. Alle Antworten, die ich gefunden habe, wurden von connection.commit() gelöst, was bisher nicht geholfen hat.

die Tabelle in Frage:

mysql> show full columns from eventlabels; 
+---------+---------+-----------+------+-----+---------+-------+---------------------------------+---------+ 
| Field | Type | Collation | Null | Key | Default | Extra | Privileges      | Comment | 
+---------+---------+-----------+------+-----+---------+-------+---------------------------------+---------+ 
| eventid | int(11) | NULL  | NO | PRI | NULL |  | select,insert,update,references |   | 
| labelid | int(11) | NULL  | NO | PRI | NULL |  | select,insert,update,references |   | 
+---------+---------+-----------+------+-----+---------+-------+---------------------------------+---------+ 
2 rows in set (0.00 sec) 

Vielen Dank für jedes Licht Sie in der Lage sein können, auf diese zu vergießen.

+0

Bitte geben Sie ein kleines Code-Snippet, das dieses Problem deutlich veranschaulicht ... dieser Code ist kein MVC (es beruht auf Variablen, die nicht im Code enthalten sind) –

+0

ok, ich habe die Art der Variablen nicht explizit angegeben angegeben; irgendwelche Gedanken? in der Nähe, wie ich vielleicht die label_id als eine Unicode-String ist es nicht sauber zu Int konvertieren, außer jede Möglichkeit zu debuggen dies kann ich denke, hat keinen Hinweis darauf, dass dies ein Problem ist. –

+0

Nun, ich gebe meine Datenbank-Anmeldeinformationen nicht aus, aber ich habe die Zeilen wie gewünscht hinzugefügt. arbeitet hier lokal, außer natürlich für das Fehlen von eingefügten Daten. irgendwelche Gedanken? - nicht sicher, was zu Ihrer vorherigen Antwort @JoranBeasley passiert ist, aber wie gewünscht dieser Code abgeschlossen ist (minus Login creds) –

Antwort

2

fand ich die Antwort in zwei Teilen:

http://laviefrugale.blogspot.com/2011/03/python-and-mysql-autocommit.html

, die auf diese lokale Antwort bezieht sich dann:

Python's MySqlDB not getting updated row

Einrichten einer Remote-Datenbank nicht mir viel bekommen haben überall, aber wie sich herausstellt, ist die fragliche Datenbank seltsam aufgebaut:

mysql> select table_name,engine FROM information_schema.tables 
    -> WHERE table_schema = DATABASE(); 
+-------------+--------+ 
| table_name | engine | 
+-------------+--------+ 
| eventlabels | InnoDB | 
| events  | MyISAM | 
| labels  | InnoDB | 
+-------------+--------+ 
3 rows in set (0.02 sec) 

Das oben erwähnte unerklärliche Verhalten war das Ergebnis der Einstellung autocommit(), die an der ersten Einfügung arbeitete (Ereignisse, eine sehr alte MyISAM-Tabelle), aber dann wird die Einstellung von eventlabels ignoriert, weil es InnoDB ist.

was ich nicht ganz herausfinden kann ist, warum das manuelle Commit keinen Unterschied machte, oder Tests db.autocommit produziert ein Nicht-EUREKA-Ergebnis, aber am Ende, Autocommit explizit für die Verbindung löste das Problem gelöst.

local_db.autocommit(True); 

im Kontext:

local_connection = data.environment('development'); 
local_db = mysql.connect(**local_connection); 
local_db.autocommit(True); 
local_curs = local_db.cursor(); 

wenn Sie schon bis hierher gelesen, hier hofft das Ihnen geholfen; währenddessen lebten MyISAM, InnoDB und meine Familie glücklich bis ans Ende ihrer Tage.

+0

Ich wusste, dass Sie das Problem lösen würde: P +5 if Ich könnte ... das Lösen Ihres eigenen Problems ist immer das Beste :) –