Django执行migrate连PostgreSQL报unsupported startup parameter错误是否与pgbouncer有关
你遇到的这个错误确实大概率是使用pgbouncer导致的。
原因说明
pgbouncer为了保证连接池内连接的参数一致性,默认会拦截未在配置中声明的PostgreSQL启动参数,你在Django配置的OPTIONS里的options属于启动参数的一种,没有在pgbouncer的允许列表里的话就会抛出unsupported startup parameter: options错误,尤其是在事务池、语句池模式下,这种限制会更严格。
可选择的解决方案
方案1:修改pgbouncer配置放开参数限制
仅适合pgbouncer使用**会话池(session pooling)**模式的场景,在pgbouncer的配置文件pgbouncer.ini中找到ignore_startup_parameters配置项,添加options参数:
ignore_startup_parameters = extra_float_digits, options
修改完成后重启pgbouncer即可生效。如果是事务/语句池模式不建议用这个方案,会出现不同连接的search_path参数互相干扰的问题。
方案2:修改Django配置,移除options参数换其他方式设置默认schema
如果使用的是事务/语句池模式,不能透传启动参数的话,可以用以下两种替代方案:
- 给数据库用户配置默认
search_path,执行一次SQL即可永久生效:
ALTER ROLE 你的数据库用户名 SET search_path TO public;
该用户后续建立的所有连接都会默认使用配置的search_path,不需要在Django侧加额外参数。
- 使用Django连接信号动态设置
search_path,不需要修改数据库或者pgbouncer配置:
在项目根目录的__init__.py或者任意已注册app的apps.py的ready()方法中添加如下代码:
from django.db.backends.signals import connection_created from django.dispatch import receiver @receiver(connection_created) def set_search_path(sender, connection, **kwargs): if connection.vendor == 'postgresql': with connection.cursor() as cursor: cursor.execute("SET search_path TO public")
方案3:切换pgbouncer池模式
如果业务允许,将pgbouncer的池模式切换为会话池模式,配合方案1的配置也可以解决问题,但会失去事务/语句池的高连接性能优势,按需选择即可。
内容的提问来源于stack exchange,提问作者Headmaster
相关产品推荐
相关产品推荐

