2013-11-29 2 views
5

Я пытаюсь выполнить миграцию своих данных id postgresql из строки в целые числа в django, чтобы использовать их в поиске sphinx. Поэтому в первую очередь я делаю миграцию данных, преобразование моих данных в целые числа в строке, как этотКласс оператора postgresql "varchar_pattern_ops" не принимает тип данных integer

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

Но я получаю сообщение об ошибке

ERROR: operator class "varchar_pattern_ops" does not accept data type integer

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

Эта ошибка возникает как на юге, так и на pgAdmi п. Данные верны - это Null или integer в строковом типе. Что я делаю не так?

+0

Какая версия postgres? Он отлично работает в 9.3: 'alter table test alter val type int using (val :: int);' –

+0

9.1.10. Я не понимаю - другой столбец является той же таблицей, которая была преобразована в целое без ошибок. Но этот столбец все еще вызывает ошибку. – FeroxTL

ответ

5

Я только в состоянии воспроизвести ваше сообщение об ошибке, как так:

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

+1

Да, это исправило проблему! Спасибо! – FeroxTL

5

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

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

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

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

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

+0

Идеальный, должен быть принятым ответом, поскольку он не включает SQL. –

+0

Я пробовал это, но для моего конкретного случая использования, когда 'ForeignKey' был« символом, изменяющимся »в PostgreSQL, а не' uuid', он не возвращал правильные файлы миграции, чтобы обновить кастинг столбцов. Мне пришлось писать чистый SQL. Но я не чувствую, что это замечательно, и я удивлен. Я думаю, что миграция никогда не должна попасть в это состояние. –

Смежные вопросы