Класс оператора 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
в связанный столбец в модели (согласно первому шагу), затем сгенерируйте миграцию и запустите снова.
Это основано на моем опыте в каком-то проекте, и это работает.
Надеюсь, поможет.