Класс оператора Postgresql "varchar_pattern_ops" не принимает целочисленный тип данных

Я пытаюсь перенести мой идентификатор данных postgresql из строки в целые числа в django, чтобы использовать их в поиске сфинксов. Итак, в первую очередь я делаю миграцию данных, преобразовывая мои данные в целые числа в строку, как это

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);

как это было сказано здесь

Но я получаю ошибку

ОШИБКА: класс операторов "varchar_pattern_ops" не принимает тип данных integer

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

Эта ошибка возникает как на юге, так и в pgAdmin. Данные верны - это NULL или целое число в строковом типе. Что я делаю неправильно?

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

Чтобы справиться с этой проблемой, вы должны использовать 2 этапа миграции.

Первый: добавить db_index=False при первой миграции создайте и запустите миграцию.

Второе: обновление db_index=True в связанный столбец в модели (согласно первому шагу), затем сгенерируйте миграцию и запустите снова.

Это основано на моем опыте в каком-то проекте, и это работает.

Надеюсь, поможет.

Другие вопросы по тегам