2016-04-10 7 views
0

Ich bin mit Python 2.7 mit dem Anaconda Paket-Manager. Der pandas.to_sql Befehl wirft ein Identifier zu lang ist Fehler.Pandas to_sql Fehler auslöst 'Identifier Name ist zu lang'

Die Codezeile, wo der Fehler ausgelöst wird:

def write_to_sql(self, pdata): 

    pdata.to_sql(self._tblname, self._db.get_connection(), flavor = 'mysql', 
     if_exists='replace', index = True, index_label = [COLUMN_ALLIANCERANK, COLUMN_ALLIANCEID, 
COLUMN_ALLIANCENAME, COLUMN_PLAYERID, COLUMN_NICK, COLUMN_LASTUPDATED]) 

der Eingangsdatenrahmen pdata im folgende Format ist. Alle außer dem letzten numerischen Feld (101, 102 ...) sind Indizes im Datenrahmen.

COLUMN_ALLIANCERANK ... COLUMN_LASTUPDATED 
value a1    ... value x1    101 
value a2    ... value x2    102 

Unten ist der Fehler dump (nur relevanter Teil)

Traceback (most recent call last): 
... ... 
    File "D:\Workspace\python\lnk\datasourceActivityTrackerChange.py", line 92, in write_to_sql 
    COLUMN_ALLIANCENAME, COLUMN_PLAYERID, COLUMN_NICK, COLUMN_LASTUPDATED]) 
    File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 1003, in to_sql 
    dtype=dtype) 
    File "C:\Python27\lib\site-packages\pandas\io\sql.py", line 569, in to_sql 
    chunksize=chunksize, dtype=dtype) 
    File "C:\Python27\lib\site-packages\pandas\io\sql.py", line 1633, in to_sql 
    table.create() 
    File "C:\Python27\lib\site-packages\pandas\io\sql.py", line 690, in create 
    self._execute_create() 
    File "C:\Python27\lib\site-packages\pandas\io\sql.py", line 1400, in _execute_create 
    conn.execute(stmt) 
    File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 205, in execute 
    self.errorhandler(self, exc, value) 
    File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.OperationalError: (1059, "Identifier name 'ix_tbl_us3_activity_tracker_allianceRank_allianceId_allianceName_playerID_nick_lastUpdated' is too 
long") 

auf den Internet-Foren der Suche nach oben, scheint es wie mysql Identifikatoren schränkt 64 Zeichen sein oder weniger. So habe ich benutze if_exists = 'append' statt 'replace' und die Tabelle direkt in der Erstellung von MySQL, die Verringerung Tabellennamen und/oder primären/Fremdschlüssel in den to_sql Argumenten, im Wesentlichen alles um den Fehler zu umgehen. Aber das hat meine Flexibilität stark eingeschränkt und auch unordentlicher (Speichern eines Teils der Daten in JSON-Dateien, um diese Fehler zu vermeiden), als es sein sollte.

Meine Frage ist
1. gibt es eine alternative Art und Weise, wo ich if_exists = 'replace' aber nicht eingeschränkt werden zu verwenden, kurze Tabelle/Spaltennamen, um in die < 64 Zeichen Voraussetzung für mysql-IDs passen nicht verwenden kann?
2. Wenn es ein besserer Weg, dies zu erreichen, bitte teilen.

Antwort

0

können Sie prüfen, den Quellcode in .../site-packages/pandas/io/sql.py, die für create index ... auf der MySQL-Seite verwendet wird:

ix_cols = [cname for cname, _, is_index in column_names_and_types 
      if is_index] 
if len(ix_cols): 
    cnames = "_".join(ix_cols) 
    cnames_br = ",".join([escape(c) for c in ix_cols]) 
    create_stmts.append(
     "CREATE INDEX " + escape("ix_" + self.name + "_" + cnames) + 
     "ON " + escape(self.name) + " (" + cnames_br + ")") 

IMO haben Sie entweder Ihren Index selbst in MySQL zu erstellen oder um sicherzustellen, dass der Indexname ist nicht länger als 64 Zeichen.

+0

Dank Max. Das ist ein guter Gedanke. Ich werde diesen Dateicode verwenden, um meinen eigenen Code zu erstellen. Hast du es schon mal probiert? wenn nicht mit mysql, vielleicht etwas anderes, wo du einen Python-Bibliothekscode benutzt hast und eine eigene Version für dich erstellt hast? Ich habe es nur einmal mit einer plot.ly Quelldatei getan, und ich frage mich, ob es irgendwelche Tipps/dos sind/donts für eine Python-Quelldatei Customizing (i eine lokale Kopie für die Minen natürlich machen und das Original nicht berühren) – schywalker