在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
相关产品推荐
相关产品推荐

