You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django、Postgres与PgBouncer中调整pg_trgm相似度阈值的可行性验证

问题解答

1. 事务块是否保证cursor与Something.objects.raw()使用同一连接?

是的,在Django的transaction.atomic()块内部,所有数据库操作(包括通过connection.cursor()创建的游标、ORM查询、raw()原生查询)都会绑定到同一个数据库连接上。atomic()会为当前线程锁定一个连接,直到事务块结束,完全不会受PgBouncer事务池的连接切换影响。

2. 你的代码是否可行?

可行,而且刚好满足你的需求:

  • 用SET LOCAL设置pg_trgm.similarity_threshold = 0.5,这个设置的作用域仅限当前事务,事务结束后会自动恢复默认值,完美适配PgBouncer事务池模式——事务结束后连接被放回池时,不会带着这个自定义设置影响其他会话。
  • 注意一个小细节:Something.objects.raw()的参数传递需要调整,第二个参数应该是参数列表,所以要把name改成[name],否则可能会出现参数不匹配的问题,修正后的代码片段:
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]))

内容的提问来源于stack exchange,提问作者Chris Curvey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:27:33