<p>如果您使用的是pandas<strong>0.13.1或更老版本,63位数字的限制确实是硬编码的,因为代码中有这一行:<a href="https://github.com/pydata/pandas/blob/v0.13.1/pandas/io/sql.py#L278">https://github.com/pydata/pandas/blob/v0.13.1/pandas/io/sql.py#L278</a></p>
<p>作为解决方法,您可以使用monkeypatch函数<code>get_sqltype</code>:</p>
<pre><code>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
</code></pre>
<p>然后只要使用你的代码就可以了:</p>
^{pr2}$
<hr/>
<p>从pandas<strong>0.14</strong>开始,sql模块在幕后使用sqlalchemy,字符串被转换为sqlalchemy<code>TEXT</code>类型,并转换为mysql<code>TEXT</code>类型(而不是<code>VARCHAR</code>),这也允许您存储大于63位数的字符串:</p>
<pre><code>engine = sqlalchemy.create_engine('mysql://scott:tiger@localhost/foo')
df.to_sql('testdata', engine, if_exists='replace')
</code></pre>
<p>只有当您仍然使用DBAPI连接而不是sqlalchemy引擎时,问题仍然存在,但是不推荐使用此选项,建议为<code>to_sql</code>提供sqlalchemy引擎。在</p>