django中使用无结构数据库+有结构数据库踩到的坑总结

#迁移数据 遇到的错误复盘

错误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

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值