Django开发填坑之路---Sqlite3更换为Postgres

数据库替换(sqlite3 -> postgres)

背景
初期开发方便,没有考虑数据库限制,后期内部系统数据量到达一定量级后需要更换数据库,且需保持数据迁移。

注意事项:

  1. 需在项目的运行环境(venv)下执行操作
  2. 项目需暂停使用(不要再有数据变化)
  3. 按文章内容 顺序执行
  • 基于sqlite3配置的情况下导出数据
  1. settings配置

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
  2. 导出数据

    python manage.py dumpdata > xxx.json
    (如果有app下migrations 和 django_migrations 表数据不一致时,有较大概率出现问题,需要自己处理下字段和同步记录一致问题。语法略,常用 --exclude --indent)

  • 安装配置postgres数据库(安装略)
    • 安装略(数据库、django插件库postgresql_psycopg2)

    • 创建数据库

      # 进入postgres
      su - postgres
      
      # 创建用户
      createuser --interactive -P
      
      # 用户名、密码
      core_django_test
      xxxxx
      # 是否超级用户
      y/n
      
      # 创建数据库db_core
      createdb --owner core_django_test db_core_test
      
      #退出
      logout 
      
    • 查看数据库

      # 进入dbshell
      python manage.py dbshell
      
      # 查看当前数据库信息
      \l
      
      

    在这里插入图片描述

  • 修改settings文件数据库配置
    # DATABASES = {
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'db_core_test',
            'USER': 'core_django_test',
            'PASSWORD': 'kI6FCvldcEqQ8bho2qj7',
            'HOST': 'localhost',
            'PORT': '',
        }
    }
    
  • 导入数据
    • 同步数据库

      # migrations、migrate
      python manage.py migrate 
      python manage.py migrate --run-syncdb
      
    • 导入数据

      python manage.py loaddata xxx.json

    • 大概率报错问题解决方案

      django.db.utils.DataError: 
              Problem installing fixture '/var/www/core/1510.json': Could not load interview.SingleChoiceQuestion(pk=71): value too long for type character varying(120)
      

      (长度问题,sqlite3数据检查不严格,max_lenth=10, 也可以存储超过10的内容)

      解决办法:
      重新修改报错位置的字段长度,后同步数据库,makemigrations、migrate

      django.db.utils.IntegrityError: Problem installing fixture '/var/www/core/1510.json': Could not load contenttypes.ContentType(pk=16): duplicate key value violates unique constraint "django_content_type_app_label_model_76bd3d3b_uniq"
               DETAIL:  Key (app_label, model)=(book, group) already exists. 
      

      (content_type特点,默认已存储有 表-model,model-field信息,需要先删除,再导入数据。

      ​ 注意,每次有migrations、migrate同步操作都需要执行下面的操作)

      解决办法:

      # 进入shell模式
      python3 manage.py shell
      
      #  执行删除命令
      from django.contrib.contenttypes.models import ContentType
      ContentType.objects.all().delete()
      
      # 完成退出
      quit()
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值