2016-04-10 7 views
0

Я запускаю python 2.7 с менеджером пакетов Anaconda. pandas.to_sql команда вызывает Идентификатор слишком длинный Ошибка.pandas to_sql вызывает ошибку «Идентификатор слишком длинный»

Строка кода, где возникает ошибка:

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]) 

вход dataframe PDATA находится в следующем формате. все кроме последнего численного поля (101, 102 ...) являются индексами в кадре данных.

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

Ниже свалка ошибка (только соответствующая часть)

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") 

Глядя на интернет-форумах, похоже, MySQL ограничивает идентификаторы быть 64 символов или менее. Поэтому я использовал if_exists = 'append' вместо 'replace' и создавал таблицу непосредственно в mysql, сокращая имя таблицы и/или первичные/внешние ключи в аргументах to_sql, по сути, что-либо, чтобы обойти эту ошибку. Но это значительно ограничило мою гибкость, а также более беспорядочную (хранение части данных в файлах JSON, чтобы избежать этих ошибок), чем это должно быть.

Мой вопрос
1. есть альтернативный способ, где я могу использовать if_exists = 'replace' но не ограничивается использованием короткие таблицы/имена столбцов для того, чтобы вписаться в требования к < 64 символов для идентификаторов MySQL?
2. Если есть лучший способ достичь этого, пожалуйста, поделитесь.

ответ

0

Вы можете проверить исходный код в .../site-packages/pandas/io/sql.py, который используется для create index ... на стороне MySQL:

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 + ")") 

ИМО вы должны либо создать свой индекс себя в MySQL или убедиться, что имя индекса не более 64 символов.

+0

Спасибо Макс. Это хорошая мысль. Я буду использовать этот файл для создания своего собственного. вы когда-нибудь пробовали это раньше? если не с mysql, может быть, что-то еще, где вы взяли код библиотеки python и создали собственную версию для себя? Я только сделал это один раз с исходным файлом plot.ly, и мне интересно, есть ли какие-либо советы/dos/donts для настройки исходного файла python (я сделаю локальную копию для моего, конечно, и не коснусь оригинала) – schywalker

Смежные вопросы