【问题标题】:Why is Django creating my TextField as a varchar in the PostgreSQL database?为什么 Django 将我的 TextField 创建为 PostgreSQL 数据库中的 varchar?
【发布时间】:2014-11-19 14:43:48
【问题描述】:

Django 1.7、Python 3.4。

在我的模型中,我定义了几个 TextField。

当我去加载一个 JSON 固定装置(它是从 SQLite3 转储生成的)时,它在第二个对象上失败了,它的一个字段有 515 个字符。

打印的错误是

psycopg2.DataError: value too long for type character varying(500)

我创建了一个新数据库(不仅仅是一个表删除,一个全新的数据库),修改了我的 settings.py 文件,在新数据库上运行 manage.py syncdb,创建了一个用户,并尝试再次加载数据,得到同样的错误。

打开 pgAdmin3 后,所有列,包括定义的 CharField 和 TextField 都列为类型character var

所以看起来 TextField 被忽略了,而 CharFields 正在被创建。 PostgreSQL 文档明确列出了文本和字符类型,并将文本定义为长度不受限制。知道为什么吗?

【问题讨论】:

  • 你确定模型没有变,字段还是TextField?>
  • 呃,为什么 ORM 坚持设置任意限制? Django 应该只使用text 或不受约束的varchar
  • @CraigRinger 我同意 django 和其他人应该默认使用 95% 的一般用例,但我确实理解为高负载应用程序保持小而快的数据库的必要性。有趣的是,Postgres 表示在 varchar 上使用 Text 没有速度损失,但所有 varchar 都受到限制,这似乎很奇怪。除非我专门处理大量数据,否则我只会在所有 Django 应用程序中使用 TextField。

标签: python sql django postgresql psycopg2


【解决方案1】:

我不确定确切的原因是什么,但它似乎与 django 的迁移工具存储迁移有关,即使在新数据库上也是如此。

我做了什么来得到这种行为:

  • 使用 CharField 创建 django 项目,然后创建应用程序
  • syncdb,运行项目的开发服务器
  • 杀死开发服务器,修改字段为TextField
  • 新建Postgres数据库,修改settings.py
  • 运行syncdb,尝试加载fixture
  • 查看有问题的错误,检查数据库实例

什么解决了问题:

  • 新建数据库,修改settings.py
  • 删除应用程序/迁移文件夹中的所有迁移
  • 运行 syncdb 后,还要运行 createmigrations 和 migrate

最后一步生成了一个迁移,即使没有存储在迁移文件夹中,并且自从在新数据库上运行 syncdb 以来,模型或数据没有任何更改,我发现这很奇怪。

在最后两个步骤中的某个地方已修复此问题。未来的人偶然发现:对不起,我不会继续创建 django 项目来进一步测试行为,但也许有了这些信息,您可以解决自己的数据库问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2013-02-06
    • 2015-01-28
    • 2017-01-28
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多