gpt4 book ai didi

python - 对于类型字符变化(255)SQLite3 到 Postgres Django 的值太长

转载 作者:行者123 更新时间:2023-12-01 00:02:34 25 4
gpt4 key购买 nike

我的 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)

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

最佳答案

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

In SQLite, the datatype of a value is associated with the value itself, not with its container. The dynamic type system of SQLite is backwards compatible with the more common static type systems of other database engines in the sense that SQL statements that work on statically typed databases should work the same way in SQLite. However, the dynamic typing in SQLite allows it to do things which are not possible in traditional rigidly typed databases.

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

Note that numeric arguments in parentheses that following the type name (ex: "VARCHAR(255)") are ignored by SQLite - SQLite does not impose any length restrictions (other than the large global SQLITE_MAX_LENGTH limit) on the length of strings, BLOBs or numeric values.

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

尝试运行类似的东西

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

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

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

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

关于python - 对于类型字符变化(255)SQLite3 到 Postgres Django 的值太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60238419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com