• 三、python Django ORM 数据库[表单增删、多数据库、数据库内容保存转移]


    一.表单增删

    1.增加

    解释:先在models.py写入模型,根据之前的迁移命令即可成功增加

    2.手动删除表单

    正确删除方式:

    1. 删除对应的models.py里面的表单对象
    2. 从视图里面,删除调用该对象的代码
    3. 执行迁移代码

    误导删除方式:
    解释:网上有好多文章都是这种删除方式,其实是错误的,只适用于不小心手动把表删除的情况(这种方法处理起来比较麻烦)

    1. 删除migrations里面初始化该数据库的文件,如果有下一个文件,打开删除dependencies依赖
    2. 在django_migrations表格里面删除写有该初始化记录的文件
    3. 自行用命令行或者可视化工具删除表格

    二、多数据库

    命令更改:生成迁移脚本python manage.py migrate --database=db #除了default,别的都需要自己设置database,生成脚本命令无需变动

    解释:即不同app使用不同的数据库

    setting.py

    DATABASE_ROUTERS = ['testDjango.dbUrls.DatabaseAppsRouter'] #对应一会单独创建的文件
    
     # 设置app对应的数据库
    DATABASE_APPS_MAPPING = {
        'testWeb':"default",
        'testCBV':"db"
    }
    
    DATABASES = {
            'default': {
            'ENGINE': 'django.db.backends.postgresql', 
        	'NAME': 'gao', 
            'USER': 'postgres', 
            'PASSWORD': '9865',
            'HOST': '192.168.1.15','PORT': '5432', 
        },
            'db': {
            'ENGINE': 'django.db.backends.postgresql',
        	'NAME': 'gh',
            'USER': 'postgres', 
            'PASSWORD': '9865',
            'HOST': '192.168.1.15',
            'PORT': '5432', 
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    testDjango/dbUrls.py
    解释:放在主目录下(存放setting.py同目录),主要存放更改后的读取、写入、更改和迁移流程(固定的直接复制即可)

    from django.conf import settings
    
    DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING  # 在setting中定义的路由表
    
    
    class DatabaseAppsRouter(object):
        def db_for_read(self, model, **hints):
            if model._meta.app_label in DATABASE_MAPPING:
                return DATABASE_MAPPING[model._meta.app_label]
            return None
    
        def db_for_write(self, model, **hints):
    
            if model._meta.app_label in DATABASE_MAPPING:
                return DATABASE_MAPPING[model._meta.app_label]
            return None
    
        def allow_relation(self, obj1, obj2, **hints):
    
            db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
            db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
            if db_obj1 and db_obj2:
                if db_obj1 == db_obj2:
                    return True
                else:
                    return False
            return None
    
        def allow_syncdb(self, db, model):
    
            if db in DATABASE_MAPPING.values():
                return DATABASE_MAPPING.get(model._meta.app_label) == db
            elif model._meta.app_label in DATABASE_MAPPING:
                return False
            return None
    
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            if db in DATABASE_MAPPING.values():
                return DATABASE_MAPPING.get(app_label) == db
            elif app_label in DATABASE_MAPPING:
                return False
            return None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    三、数据库内容转移

    解释:这个其实可以使用django自带的功能,只不过自带内容bug很多,建议使用navicat这类的软件

    1. 导出

    解释:选择导出向导,建议使用csv格式(这种格式导入的时候全部默认就能成功导入),之后可以全选下一步也能成功导入
    在这里插入图片描述

    2.导入

    解释:进入导入向导,选择之前导出的格式,全选下一步也能成功导入
    在这里插入图片描述

  • 相关阅读:
    基于51单片机GPS定位系统设LCD12864显示(程序+原理图+PCB+论文)
    吴军《浪潮之巅》阅读随笔(一)
    2021年下半年《信息系统项目管理师》论文考试真题
    Sourcemap安全问题
    【百度翻译API接口调用-Python语言】
    Qt界面容器:Widget、 Frame、分组框、滚动区、工具箱、选项卡小部件、堆叠小部件控件精讲
    Docker使用数据卷挂载进行数据存储与共享
    element-ui dialog弹窗 设置点击空白处不关闭
    100道护网面试题大全(附答案)
    OLAP介绍
  • 原文地址:https://blog.csdn.net/weixin_46765649/article/details/126445463