如果您使用熊貓0.13.1以上,63位這一限制確實是硬編碼,因爲這一行的代碼,:https://github.com/pydata/pandas/blob/v0.13.1/pandas/io/sql.py#L278
作爲一種變通方法,你也許可以猴補丁該功能get_sqltype
:
from pandas.io import sql
def get_sqltype(pytype, flavor):
sqltype = {'mysql': 'VARCHAR (63)', # <-- change this value to something sufficient higher
'sqlite': 'TEXT'}
if issubclass(pytype, np.floating):
sqltype['mysql'] = 'FLOAT'
sqltype['sqlite'] = 'REAL'
if issubclass(pytype, np.integer):
sqltype['mysql'] = 'BIGINT'
sqltype['sqlite'] = 'INTEGER'
if issubclass(pytype, np.datetime64) or pytype is datetime:
sqltype['mysql'] = 'DATETIME'
sqltype['sqlite'] = 'TIMESTAMP'
if pytype is datetime.date:
sqltype['mysql'] = 'DATE'
sqltype['sqlite'] = 'TIMESTAMP'
if issubclass(pytype, np.bool_):
sqltype['sqlite'] = 'INTEGER'
return sqltype[flavor]
sql.get_sqltype = get_sqltype
然後就是用你的代碼應該工作:
df.to_sql(con=con_mysql, name='testdata', if_exists='replace', flavor='mysql')
從熊貓0.14中,SQL模塊是開始使用SQLAlchemy的引擎蓋下,和字符串被轉換爲SQLAlchemy的TEXT
類型,至極被轉換到MySQL TEXT
類型(和不VARCHAR
),這也將允許您可以存儲更大的字符串長度超過63個數字:
engine = sqlalchemy.create_engine('mysql://scott:[email protected]/foo')
df.to_sql('testdata', engine, if_exists='replace')
只有當你還在用一個DBAPI連接,而不是SQLAlchemy的發動機,這個問題仍然存在,但該選項已被棄用,建議提供SQLAlchemy的發動機to_sql
。
什麼版本的熊貓使用? – joris
0.12.0,當我有問題。我剛剛升級到最新版本的pip安裝版本0.13.1。但從你的答案來看,這與0.12.0會有相同的問題。 – MichM