Как использовать операторы 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%%'
Я считаю, что этот запрос должен быть достаточным для ваших целей.