Как использовать операторы pg_trgm (например,%>) в каркасе django? - PullRequest
0 голосов
/ 23 января 2019

Я использую 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 ]

0 голосов
/ 23 января 2019

Похоже, что ваша проблема на самом деле связана с подстановкой строк в 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 .

0 голосов
/ 23 января 2019

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

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

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

...