Postgresql 运算符类“varchar_pattern_ops”不接受数据类型整数

Posted

技术标签:

【中文标题】Postgresql 运算符类“varchar_pattern_ops”不接受数据类型整数【英文标题】:Postgresql operator class "varchar_pattern_ops" does not accept data type integer 【发布时间】:2013-12-15 13:54:09 【问题描述】:

我正在尝试将我的数据 id postgresql 从字符串迁移到 django 中的整数,以便在 sphinx 搜索中使用它们。所以首先我正在进行数据迁移,将我的数据转换为字符串中的整数,像这样

db.execute('''UPDATE the_table SET foo='1' WHERE foo='bar';''')

然后我进行架构迁移

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);

就像有人告诉here

但是我遇到了一个错误

错误:运算符类“varchar_pattern_ops”不接受数据类型整数

SQL-состояние: 42804

此错误在 South 和 pgAdmin 中都会发生。数据是正确的 - 它是字符串类型的 Null 或整数。我做错了什么?

【问题讨论】:

哪个版本的 postgres?它在 9.3 中运行良好:alter table test alter val type int using (val::int); 9.1.10。我不明白 - 另一列是同一个表,只是被转换为整数而没有错误。但是此列仍然导致错误。 【参考方案1】:

处理这个问题,你必须使用 2 个迁移步骤。

首先:在您的第一次迁移中添加db_index=False,然后生成并运行迁移。

第二次:db_index=True更新到模型中的相关列(根据第一步),然后生成迁移并再次运行。

这是基于我在一些项目上的经验,它确实有效。

希望对你有帮助。

【讨论】:

完美,应该是公认的答案,因为它不涉及 SQL。 我试过这个,但是对于我的特殊用例,ForeignKey 在 PostgreSQL 中是 character varying 而不是 uuid,它没有重新生成正确的迁移文件来更新列铸件。我必须编写纯 SQL。不过我感觉不是很好,很惊讶。我认为迁移永远不应该进入那种状态。【参考方案2】:

我只能像这样重现您的错误消息:

denis=# create index test_idx on test (val varchar_pattern_ops);
CREATE INDEX
denis=# alter table test alter val type int using (val::int);
ERROR:  operator class "varchar_pattern_ops" does not accept data type integer

如果您有这样的时髦索引,请尝试像这样删除并重新创建它:

denis=# drop index test_idx;
DROP INDEX
denis=# create index test_idx on test (val);
CREATE INDEX
denis=# alter table test alter val type int using (val::int);
ALTER TABLE

相关文档:

http://www.postgresql.org/docs/current/static/indexes-opclass.html

【讨论】:

是的,这解决了问题!谢谢!

以上是关于Postgresql 运算符类“varchar_pattern_ops”不接受数据类型整数的主要内容,如果未能解决你的问题,请参考以下文章

postgresql——运算符介绍

SQLAlchemy中的PostgreSQL RAW查询[重复]

PostgreSQL学习总结—— PostgreSQL 运算符与表达式

PostgreSQL 中的 add equals 运算符是啥? [复制]

Postgresql中函数详解看一篇就够了——常用函数以及使用方法

PostgreSQL 中的 IN 与 ANY 运算符