我正在使用 Pandas 和 SQLAlchemy 在一个 CSV 文件上应用一些 ETL
验证字段并转换其中一些字段后,我尝试导出到我的 PostgreSQL 数据库,但我收到一个没有意义的错误:
sqlalchemy.exc.DataError: (psycopg2.DataError) value too long for type character varying(50)
我已经将该字段更改为多个值(最初设置为 15)。我试图获取该字段的 NaN
值并替换为“”(只有一个字段)。为此,我使用了:
>>> df.loc[df['foo'].isnull(), 'foo'] = ''
我尝试将 chunksize
更改为 5000 和 1000。最初,它没有设置。
>>> df.to_sql("mytable", con, index=False, if_exists='append', chunksize=1000)
上面的命令适用于 sqlite
遇到这些问题后,我再次检查了引发错误的列,看它的长度是否有任何问题。显然,它没有,但我还是运行了以下代码:
>>> df.foo.str.len().max()
11.0
我还尝试了以下方法:
>>> df.fillna(value='', inplace=True)
>>> df['foo'] = df['foo'].str.strip()
然后我也加了
for f in Inventory._meta.get_fields():
if f.get_internal_type() == 'CharField':
df[f.name] = df[f.name].str[:f.max_length]
但是也没用
我最后把列的长度设置为100,但是这是不对的。该字段每行仅包含 11 个字符。我没有想法了。这个错误很奇怪,非常感谢您的帮助。
最佳答案
好吧,发生的事情真是令人尴尬。上面的代码从一开始就是正确的。问题是我合并了一些行并在该列中连接了不同函数中的合并值,但我忘记了。我以为错误只出现在我的验证函数中,而实际上它从来没有出现过。
我做了什么才能找到它?
我将列的值更改为一个较大的值 (100),这样上面的代码就可以运行了,然后我运行了以下 SQL:
SELECT length(foo) AS ln_foo FROM inventory WHERE length(foo) > 11
关于python - Pandas to_sql() 不适用于 PostgreSQL - 对于类型字符不同的值太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40086386/