我刚遇到这个问题,想要添加一些信息。在解决这个问题时,我通过迁移来理解了它。任何能够补充的人,请随意添加,包括更正。
这个应用程序正在使用 Django 1.11、Py3,并且正在从早期的本地 SQLite 开发中迁移到 PG(只是为了证明一些概念)。当迁移到 PG 时,我遇到了同样的错误:
ERROR: operator class "varchar_pattern_ops" does not accept data type uuid
我有两种方法可以解决它。在我的应用程序早期阶段,我能够清除并从头开始。我知道这很少是一个选项,但我的行动为在迁移或升级方案中修复此问题提供了有用的线索。我在 ORM 不常用的时候就已经掌握了良好的 SQL/PG 技巧。这个问题对我来说真是一个难题。
问题
在我五岁的大脑中,问题是通过更改列类型而来的,从字符串到UUID "本地"。通过应用程序中的迁移似乎创建了一个不是UUID本地的列。随着Django模型UUIDField的引入,需求无法满足并抛出了上述错误。这个问题类似于在具有非整数值的情况下从str到int类型在数据库中做一些愚蠢的事情。
修复信息
我有两种方法来解决这个问题。
第一种方法是通过Django的压缩迁移。我已经遇到了与我的应用程序中UUID使用相关的类似错误,所以我知道这种错误的模式。通过压缩迁移,您可以跳过早期的非UUIDField列创建,并仅执行正确的列声明。当我重新运行(新鲜)迁移时,一切都很顺利。
第二种方法几乎没有变化,但我杀死了所有迁移并从当前状态开始。与之前的效果相同。
所以...
说了这么多,对我来说,我能够以一种符合我的思维方式的方式来逆向工程解决问题。 "修复" 的方法是永远不要将列设置为除了 UUIDField 友好方式之外的方式。我的问题与 SQLite 到 PG 交换有关(据我所知)。
如果我进行升级,我认为删除索引并重新创建它们是正确的方法。
再次强调,只是尝试提供一些关于这个错误的信息,但谷歌并没有返回任何真正吸引我的内容。所以我拿出了镐和手电筒。
\d tablename
。 - fl0cke