YugabyteDB暂不支持SAVEPOINTS时Django迁移报错如何解决?
问题复现
现有已配置对接YugabyteDB的Django应用,执行迁移操作时抛出如下错误:
Traceback (most recent call last): File "/opt/env/lib/python3.6/site-packages/django/contrib/contenttypes/models.py", line 54, in get_for_model ct = self.get(app_label=opts.app_label, model=opts.model_name) File "/opt/env/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/opt/env/lib/python3.6/site-packages/django/db/models/query.py", line 380, in get self.model._meta.object_name __fake__.DoesNotExist: ContentType matching query does not exist. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/env/lib/python3.6/site-packages/django/db/models/query.py", line 464, in get_or_create return self.get(**lookup), False File "/opt/env/lib/python3.6/site-packages/django/db/models/query.py", line 380, in get self.model._meta.object_name __fake__.DoesNotExist: ContentType matching query does not exist. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 62, in execute return self.cursor.execute(sql) File "/opt/env/lib/python3.6/site-packages/django_prometheus/db/common.py", line 63, in execute return super(CursorWrapper, self).execute(*args, **kwargs) psycopg2.errors.FeatureNotSupported: SAVEPOINT <transaction> not supported yet LINE 1: SAVEPOINT "s140500455238528_x1" ^ HINT: See https://github.com/YugaByte/yugabyte-db/issues/1125. Click '+' on the description to raise its priority
根因说明
报错的根本原因是当前使用的YugabyteDB版本未兼容PostgreSQL的SAVEPOINT特性,Django执行迁移过程中处理get_or_create这类逻辑时,默认会调用保存点能力处理异常场景,最终触发数据库不支持的报错。
解决方案
- 关闭Django数据库配置中的保存点开关
在Django项目的settings.py文件中,找到对应YugabyteDB的数据库连接配置,新增savepoints: False配置项即可:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': '你的数据库名称', 'USER': '数据库账号', 'PASSWORD': '数据库密码', 'HOST': '数据库地址', 'PORT': '5433', # 新增以下配置关闭保存点支持 'OPTIONS': { 'savepoints': False } } }
- 执行迁移时禁用全局原子事务
Django的migrate命令默认会将整个迁移任务包裹在单个原子事务中执行,也会触发保存点调用,执行迁移时添加--atomic=false参数即可规避:
python manage.py migrate --atomic=false
注意事项
- 关闭保存点后,业务代码中如果存在显式嵌套
atomic()事务的逻辑需要调整,嵌套事务会直接升级为全局事务,内层逻辑报错会导致整个外层事务全部回滚,不再支持仅回滚内层事务的能力。 - 非原子模式执行迁移前建议提前备份数据库数据,避免迁移中途执行失败导致的数据不一致问题。
- YugabyteDB后续稳定版本已经支持SAVEPOINT特性,升级到对应版本后可移除上述配置,恢复默认行为。
内容的提问来源于stack exchange,提问作者MarkoR
相关产品推荐
相关产品推荐

