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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:51:03