【问题标题】:Django shift to PostgreSQL fails to import fixtures, stating data too longDjango shift to PostgreSQL 无法导入fixture,说明数据太长
【发布时间】: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 中失败的任何想法?

【问题讨论】:

    标签: django json sqlite postgresql fixtures


    【解决方案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 个字符的属性,然后检查您的固定装置是否有超过该最大长度的数据。

      【讨论】:

        猜你喜欢
        • 2023-02-22
        • 2015-01-30
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多