将数据帧复制到sql时,列宽不够

时间:2015-03-30 07:37:34

标签: pandas pymysql

我在代码中有以下行,效果很好!

df.to_sql(con=connection, name='my_tbl_name', if_exists='replace', flavor='mysql')

但问题是它使用varchar(63)创建列,并且数据长度超过63个字节。

我收到了这个警告:

/home/anaconda/lib/python2.7/site-packages/pymysql/cursors.py:134: Warning: Data truncated for column '2' at row 1
  result = self._query(query)

如何确保pandas创建一个包含varchar(255)而不是63?

的表

1 个答案:

答案 0 :(得分:3)

假设您使用的是pandas> = 0.14的版本,您应该使用sqlalchemy来建立数据库连接(不推荐使用mysql的DBAPI连接,请参阅http://pandas.pydata.org/pandas-docs/stable/io.html#sql-queries):

engine = sqlalchemy.create_engine("mysql+pymysql://....")
df.to_sql('my_tbl_name', engine, if_exists='replace')

执行此操作时,您的文本列不会被截断,因为默认使用sqlalchemy TEXT sql type。如果要将此更改为例如VARCHAR且具有一定长度,则可以使用dtype参数(但这需要pandas 0.16):

from sqlalchemy.types import VARCHAR
df.to_sql('my_tbl_name', engine, dtype={'Col_2': VARCHAR(256)})

当您使用旧版本的pandas时,或者出于某种原因无法使用sqlalchemy时,您可以看到此答案的解决方法:pandas to_sql truncates my data