2016-04-10 23 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]) 

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文字以下にする識別子を制限ように、それはそうです。だから、'replace'の代わりにif_exists = 'append'を使用し、mysqlにテーブルを直接作成して、to_sql引数のテーブル名やプライマリ/外部キーを減らしました。しかし、これは私の柔軟性を大幅に制限しているだけでなく、これらのエラーを避けるためにJSONファイルにデータの一部を格納することも必要以上に大変です。

私の質問は、私はif_exists = 'replace'を使用することができますが、MySQLの識別子の< 64文字の要件に適合するために、短いテーブル/カラム名を使用するように制限されていない別の方法がある
1ですか?
2.これを達成するより良い方法がある場合は、教えてください。

答えて

0

あなたは、MySQL側でcreate index ...のために使用されている.../site-packages/pandas/io/sql.pyソースコード、チェックすることができます:IMO

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ソースファイルを使って一度しか作っていませんが、pythonソースファイルをカスタマイズするためのヒント/ dos/dontsがあるかどうか疑問に思っています(もちろん私のローカルコピーを作成し、 – schywalker

関連する問題