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