Как использовать операторы pg_trgm (например,%>) в структуре django?

Я использую pg_trgm для поиска сходства в БД PostgreSQL и мне нужно вернуть результаты на передний план, используя модель Django. Но у меня проблема в том, что оператор %> не может быть распознано в рамках Django.

Любой совет?

Спасибо.

Я использую model.objects.raw() выполнить SQL. Я получил сообщение об ошибке:

unsupported format character '>' (0x3e) at index 52
searchParam ='test'
mymodel.objects.raw('select * from mytable where columnname %> %s', [searchParam])
ValueError: response:unsupported format character '>' (0x3e) at index 52

2 ответа

Решение

Похоже, что ваша проблема на самом деле связана с подстановкой строк в Python. Чтобы построить окончательную строку запроса, Django делает что-то вроде:

self.sql % self.params

Это использует старый стиль%-форматирования, который хочет интерпретировать ваш %> как механизм подстановки строк, аналогичный %s, но это недопустимая комбинация. Чтобы создать % символ в отформатированной строке, вы просто должны использовать %% во входной строке вот так:

In [1]: MyModel.objects.raw('SELECT * FROM myapp_mymodel WHERE myfield %%> %s', ['test'])
Out[1]: <RawQuerySet: SELECT * FROM myapp_mymodel WHERE myfield %> test>

...

Кстати, у Django есть документация по основному использованию pg_trgm без необходимости прибегать к необработанным строкам запроса. Просто убедитесь, что у вас есть миграция, которая сначала активирует расширение:

В добавок к trigram_similar ищите, вы можете использовать несколько других выражений.

Чтобы использовать их, вам нужно активировать pg_trgm расширение на PostgreSQL. Вы можете установить его, используя TrigramExtension миграционная операция.

Попробуйте заменить %> срок с сбежавшим %% условное обозначение. Это должно привести к следующему простому запросу SQL:

'select * from mytable where columnname = %%%s%%'

Я считаю, что этот запрос должен быть достаточным для ваших целей.

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