Django shift to PostgreSQL 无法导入fixture,说明数据太长

Posted

技术标签:

【中文标题】Django shift to PostgreSQL 无法导入fixture,说明数据太长【英文标题】:Django shift to PostgreSQL fails to import fixtures, stating data too long 【发布时间】:2011-01-23 12:58:21 【问题描述】:

我正在从使用 SQLite3 切换到 PostgreSQL,并希望我可以使用我用来填充 SQLite3 的固定装置来填充数据库。但是,我收到以下错误:

$ python manage.py loaddata fixtures/core.json fixtures/auth.json

Installing json fixture 'fixtures/core' from absolute path.
Problem installing fixture 'fixtures/core.json': Traceback (most recent call last):
  File "/home/mvid/webapps/nihl/nihlapp/django/core/management/commands/loaddata.py", line 153, in handle
    obj.save()
  File "/home/mvid/webapps/nihl/nihlapp/django/core/serializers/base.py", line 163, in save
    models.Model.save_base(self.object, raw=True)
  File "/home/mvid/webapps/nihl/nihlapp/django/db/models/base.py", line 495, in save_base
    result = manager._insert(values, return_id=update_pk)
  File "/home/mvid/webapps/nihl/nihlapp/django/db/models/manager.py", line 177, in _insert
    return insert_query(self.model, values, **kwargs)
  File "/home/mvid/webapps/nihl/nihlapp/django/db/models/query.py", line 1087, in insert_query
    return query.execute_sql(return_id)
  File "/home/mvid/webapps/nihl/nihlapp/django/db/models/sql/subqueries.py", line 320, in execute_sql
    cursor = super(InsertQuery, self).execute_sql(None)
  File "/home/mvid/webapps/nihl/nihlapp/django/db/models/sql/query.py", line 2369, in execute_sql
    cursor.execute(sql, params)
  File "/home/mvid/webapps/nihl/nihlapp/django/db/backends/util.py", line 19, in execute
    return self.cursor.execute(sql, params)
DataError: value too long for type character varying(30)

我从来没有遇到过任何数据长度错误,也没有在数据库切换之间更改模型。 PostgreSQL 正在运行 utf8。有没有办法准确查看它失败的 json 值,以便我可以更新相应的模型?关于为什么这些值在 SQLite 中有效但在 PostgreSQL 中失败的任何想法?

【问题讨论】:

【参考方案1】:

Sqlite 不强制 varchar(n) 的长度。来自 sqlite 常见问题解答:

http://www.sqlite.org/faq.html#q9

【讨论】:

【参考方案2】:

检查 Postgres 日志文件,它将记录完整的失败 SQL 语句,包括表名和违规字符串值。

【讨论】:

很遗憾,我的主机 Webfaction 没有保留 PostgreSQL 日志。【参考方案3】:

要解决实际问题,请将您的声明更改为文本。这将允许您导入数据并对其进行清理。然后你可以重新应用一个约束。

【讨论】:

varchar(30) 不是可以删除的约束。不过,他可以更改声明中的数据类型。【参考方案4】:

检查您尝试插入 Postgres 的 fixtures/core.json 中 SQLLite 的数据长度。看起来数据超过 30 个长度字符。检查您的 django 模型是否有限制为 30 个字符的属性,然后检查您的固定装置是否有超过该最大长度的数据。

【讨论】:

以上是关于Django shift to PostgreSQL 无法导入fixture,说明数据太长的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host

[HDU2577]How to Type(DP)

电脑开不了机,黑屏显示Press Shift-f10 to configure..就不动了

论文导读Recovering Latent Causal Factor for Generalization to Distributional Shifts

论文导读Recovering Latent Causal Factor for Generalization to Distributional Shifts

Django - render()、render_to_response() 和 direct_to_template() 有啥区别?