将数据框复制到 sql 时列宽不够
column width not sufficient when copying dataframe to sql
我在代码中有以下行,效果很好!
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 创建 table?
假设您使用的是 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 is used by default. If you want to change this to eg 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
我在代码中有以下行,效果很好!
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 创建 table?
假设您使用的是 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 is used by default. If you want to change this to eg 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