为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】*:
django-dmPython = "==3.1.7"
dmPython = "==2.5.5"
在执行python manage.py migrate时,以下sql执行报错:
ALTER TABLE /*+ALTER_TAB_COMMIT(0)*/ "DJANGO_ADMIN_LOG" DISABLE CONSTRAINT "DJANGO_ADMIN_LOG_USER_ID_C564EBA6_FK_ACCOUNT_BKUSER_ID";
但是指定schema下的DJANGO_ADMIN_LOG表并不需要DJANGO_ADMIN_LOG_USER_ID_C564EBA6_FK_ACCOUNT_BKUSER_ID这个约束,但还是报错了。
排查django-dmPython代码,在django-dmPython/operations.py:434中,有获取表的约束列表:
可以看到,官方提供的库中,执行的sql没有指定OWNER(schema),而是查询了所有table_name为DJANGO_ADMIN_LOG的约束。
同时在django-dmPython/base.py:263中,生成alter的sql时,没有区分OWNER,而是对所有查询出来的约束名进行了ALTER:
此时如果有多个schema存在同样名为DJANGO_ADMIN_LOG的表,那所有table_name为DJANGO_ADMIN_LOG的约束都会查询出来,但是并不是所有的schema都有创建所查询出来的这些约束名,导致提示无效的约束名。
例如我的环境中,有些scheme的DJANGO_ADMIN_LOG的约束名为DJANGO_ADMIN_LOG_USER_ID_C564EBA6_FK_AUTH_USER_ID,有些是DJANGO_ADMIN_LOG_USER_ID_C564EBA6_FK_ACCOUNT_BKUSER_ID
此时我在schema为svc_rabbitmq中执行时,因为django-dmPython以上原因拿到了tencent_paas.DJANGO_ADMIN_LOG的DJANGO_ADMIN_LOG_USER_ID_C564EBA6_FK_ACCOUNT_BKUSER_ID的约束名,但svc_rabbitmq.DJANGO_ADMIN_LOG并没有这个约束名 从而引起异常。
感觉你这个用的有点问题,正常情况下,是单用户单模式,你这个是一个用户创建了多个模式么?如果是单用户单模式查USER_CONSTRAINTS这个表应该只能查到自己用户下的,如果是单用户多模式的话,可能代码就需要改下了,加上owner的字段。