#迁移数据 遇到的错误复盘
错误1:
djongo.exceptions.SQLDecodeError:
Keyword: None
Sub SQL: None
FAILED SQL: ('INSERT INTO "django_migrations" ("app", "name", "applied") VALUES (%(0)s, %(1)s, %(2)s)',)
Params: (['contenttypes', '0001_initial', datetime.datetime(2024, 4, 25, 1, 12, 25, 839781)],)
Version: 1.3.6
raise db_exe from e
django.db.utils.DatabaseError
按网络上说的下载了pymongo==3.12.1还是这个错误
后面使用全新的django项目测试发现是django版本太高了。
最后配置如下:
asgiref==3.8.1
Django==4.1.13
djongo==1.3.6
dnspython==2.6.1
pymongo==3.12.1
pytz==2024.1
sqlparse==0.2.4
因为在settings.py中INSTALLED_APPS加了
'django_celery_beat',
'django_celery_results',出现
raise SQLDecodeError
djongo.exceptions.SQLDecodeError:
Keyword: None
Sub SQL: None
FAILED SQL: ('UPDATE "django_celery_results_taskresult" SET "date_created" = "django_celery_results_taskresult"."date_done"',)
Params: ((),)
Version: 1.3.6
解决办法:先注释掉他们两个。(其实只要先注释掉`'django_celery_results',`)
迁移有序结构数据库的过程中还遇到错误:
raise ValueError(
ValueError: Related model 'myapp.user' cannot be resolved
原因:1.模型定义的时候使用了AbstractUser然后引用了外键关键的是它的迁移文件的序号不是001,所以它无法自动解决。
解决办法:因为先前我是先迁移无结构数据库,所以删掉migrations中除__init.py__的所有文件,然后清空了数据库中的表(因为我的情况是都不是重要数据就全清理了,实在是不想折腾了……)然后迁移有结构的数据库。最后才是迁移无结构数据库内容(这里我注释掉了‘'django_celery_beat',
'django_celery_results'),最后恢复这两个注释的内容,最后在执行了一次`python manage.py migrate`。
在settings.py中我使用的数据库的defult也是根据要迁移的数据库的时候变化的,最后结束的时候是将有结构数据库放在了default中,然后无结构数据库是在下面定义了一个‘mongo1’(因为我使用了mongo,所以随便取得)
最后在放一下他们的定义:
DATABASES = {
"default": {
'ENGINE': "django.db.backends.postgresql_psycopg2",
'NAME': 'dbname',
'USER': 'username',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '5432',
'ATOMIC_REQUESTS': True,
},
"mongodb1": {
'ENGINE': "djongo",
'ENFORCE_SCHEMA': False, # 不会强制执行模式校验
'NAME': 'dbname',
'CLIENT': {
'host': 'localhost',
'port': 27017,
'username': 'username',
'password': 'password',
'authSource': 'admin',
'authMechanism': 'SCRAM-SHA-1'
},
'LOGGING': {
'version': 1,
'loggers': {
'djongo': {
'level': 'DEBUG',
'propagate': False,
}
},
},
}
}
在models.py中的无结构模型有添加:
def save(self, *args, **kwargs):
self._state.db = 'mongodb1' # 指定使用名为 'mongodb1' 的数据库连接
super(yourmodelname, self).save(*args, **kwargs)
以及在这个文件中,根据我个人的项目情况:
from djongo import models as djongo_models
from django.utils import timezone
import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser