python - Pandas to_sql() 不适用于 PostgreSQL - 对于类型字符不同的值太长

标签 python django postgresql pandas django-models

我正在使用 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/

相关文章:

python - pytables支持NULL吗?

django - 为夹层中的非模型 View 添加自定义管理类别和页面

javascript - 如何使用 dajax/dajax-ice 填充 div?

hibernate - JPA @Lob 属性编码不适用于 PostgreSQL 文本

ruby-on-rails - 名称错误 : unitialized constant User for rake db:migrate in Heroku

python - 在 python pandas 中添加 2 个数据框

python - 如何修改 Wordnet Lemmatizer 以对特定单词进行词形还原?

python - 返回值错误

python - 如何在模板中显示递归数据?

postgresql - Postgres 时差