【问题标题】:Value too long for type character varying(255) SQLite3 to Postgres Django对于 Postgres Django 的类型字符变化(255)SQLite3 的值太长
【发布时间】:2020-02-15 11:41:59
【问题描述】:

对于我的 Django 应用程序,我已从使用 SQLite3 切换到 Postgres。

我已经运行了这些命令来从 SQLite3 数据库中获取我的所有数据,并且我想将其添加到 Postgres 数据库中:

python manage.py dumpdata > db.json
python manage.py loaddata db.json

然后我得到了这个错误:

Could not load database.Object(pk=XXXXXXXXXX): value too long for type character varying(255)

在我的models.py中,max_length设置为10,主键的值为10。

这是我为该对象的模型设置主键的方法:

models.CharField(max_length=10, unique=True, primary_key=True)

为什么我会收到这个错误?我有很多关于这个问题的其他线程,但我还没有找到解决我问题的答案。

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    SQLite uses a form of dynamic typing(加粗):

    在 SQLite 中,值的数据类型与值本身相关联,而不是与其容器相关联。 SQLite 的动态类型系统向后兼容其他数据库引擎的更常见的静态类型系统,因为在静态类型数据库上工作的 SQL 语句应该在 SQLite 中以相同的方式工作。 但是,SQLite 中的动态类型允许它完成传统刚性类型数据库中无法完成的事情。

    它不做的“刚性”事情之一是强制列长度:

    请注意,SQLite 会忽略类型名称后面的括号中的数字参数(例如:“VARCHAR(255)”) - SQLite 不会对长度施加任何长度限制(除了大的全局 SQLITE_MAX_LENGTH 限制)字符串、BLOB 或数值。

    听起来您的某些数据实际上并不适合您定义的列类型。现在您正在迁移到 PostgreSQL,您可能需要手动修复一些数据或相应地调整您的模型。

    尝试运行类似的东西

    select * from app_table order by length(column) desc limit 1;
    

    查看该列中实际最长的值是多少。然后扩展您的模型或修复数据。

    顺便说一句,目前尚不清楚您是将整个工作流程迁移到 PostgreSQL 还是只是尝试将数据从开发复制到生产。我强烈建议你在开发中使用 Postgres,如果这是你在生产中的目标数据库。

    您现在遇到的问题是一个很好的例子,说明了一个 RDBMS 如何不能替代另一个 RDBMS。您希望在开发中发现这些问题,而不是在尝试部署到生产环境时。

    【讨论】:

    • 非常感谢您的有用回答!我想将我的整个工作流程迁移到 Postgres。当我运行命令select length(column) from table_name order by length(column) desc limit 1 时,结果如预期的那样是10。你认为问题是什么?该错误是否意味着我检查的特定列有错误,还是其他字段之一有问题?所有其他字段的长度也都在 255 个字符以下...
    • 错误消息引用VARCHAR(255),而不是VARCHAR(10)。您确定您正在查看导致问题的列吗?
    • 非常感谢!我找到了出现问题的列!你的回答真的很有帮助!我肯定会使用 Postgres 进行开发和生产!你非常有帮助!
    猜你喜欢
    • 2019-10-01
    • 2021-10-20
    • 2016-07-26
    • 1970-01-01
    • 2014-03-10
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多