Использование пользовательских сходств триграмм с Django, Postgres и PgBouncer

Я хочу скорректировать pg_trgm.similarity_threshold некоторые из моих запросов. Но поскольку я использую PgBouncer (в режиме объединения транзакций) для обеспечения доступа к моей базе данных Postgres, я хочу быть уверен, что, когда я закончу, значение сеанса будет возвращено к значению по умолчанию.

Сработает ли это?

from django.db import connection, transaction

from myapp.models import Something

def do_something(name):
    full_query = """
        select *
        from myapp_something
        where name %% %s
        """
    with transaction.atomic():
        with connection.cursor() as cursor:
            cursor.execute("set local pg_trgm.similarity_threshold = 0.5")
            return list(Something.objects.raw(full_query, name))

Задан другой вопрос... гарантирует ли блок транзакций, что курсор и Something.objects.raw() используют одно и то же соединение?

Возможно, вы можете просто обернуть все это в запрос с помощью:

Something.objects.alias(
    similarity = TrigramSimilarity('name', name)
).filter(similarity__gt=0.5).order_by('-similarity')

это также позволяет вам использовать Django ORM.

Вернуться на верх