暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Django: 原生SQLite数据导出与加载

Nephilim 2024-08-23
114

Tips:一些记录,一些笔记



2024/08/23

FRIDAY

Courtesy is the inseparable companion of virtue.

礼貌和美貌是分不开的伴侣。




01

Django默认的后端数据库


在Django中,如果你不做配置的修改,那么你默认的后端DB是SQLite:

    # Database
    # https://docs.djangoproject.com/en/5.0/ref/settings/#databases


    DATABASES = {
    "default": {
    "ENGINE": "django.db.backends.sqlite3",
    "NAME": BASE_DIR "db.sqlite3",
    }
    }


    它通常被存放在Django项目的根目录中,如下所示:


    02

    SQLite全库导出

    不考虑 Django,从数据库的角度来说,对SQLite做全库导出的方法如下所示:

      (base) adamhuan@Leviathan djangoProject__data_search % pwd
      /Users/adamhuan/adamhuan_code_base/data-life-management/djangoProject__data_search
      (base) adamhuan@Leviathan djangoProject__data_search %
      (base) adamhuan@Leviathan djangoProject__data_search % ls -ltr
      total 512
      -rwxr-xr-x 1 adamhuan staff 696 8 7 11:38 manage.py
      drwxr-xr-x 2 adamhuan staff 64 8 7 11:38 templates
      drwxr-xr-x 5 adamhuan staff 160 8 8 11:30 utils
      -rw-r--r--@ 1 adamhuan staff 156 8 15 09:36 requirements.txt
      drwxr-xr-x 13 adamhuan staff 416 8 15 13:14 craft
      drwxr-xr-x 8 adamhuan staff 256 8 19 19:25 djangoProject__data_search
      drwxr-xr-x 12 adamhuan staff 384 8 19 19:41 section
      drwxr-xr-x 12 adamhuan staff 384 8 19 19:49 product
      -rw-r--r-- 1 adamhuan staff 172032 8 20 08:54 db.sqlite3
      -rw-r--r--@ 1 adamhuan staff 53262 8 21 16:39 sqlite_data_20240821.json
      (base) adamhuan@Leviathan djangoProject__data_search %
      (base) adamhuan@Leviathan djangoProject__data_search % sqlite3
      SQLite version 3.41.2 2023-03-22 11:56:21
      Enter ".help" for usage hints.
      Connected to a transient in-memory database.
      Use ".open FILENAME" to reopen on a persistent database.
      sqlite> .open db.sqlite3
      sqlite> .output sqlite_data_20240821.sql
      sqlite> .dump
      sqlite>
      sqlite> .exit
      (base) adamhuan@Leviathan djangoProject__data_search %
      (base) adamhuan@Leviathan djangoProject__data_search % ls -ltr
      total 592
      -rwxr-xr-x 1 adamhuan staff 696 8 7 11:38 manage.py
      drwxr-xr-x 2 adamhuan staff 64 8 7 11:38 templates
      drwxr-xr-x 5 adamhuan staff 160 8 8 11:30 utils
      -rw-r--r--@ 1 adamhuan staff 156 8 15 09:36 requirements.txt
      drwxr-xr-x 13 adamhuan staff 416 8 15 13:14 craft
      drwxr-xr-x 8 adamhuan staff 256 8 19 19:25 djangoProject__data_search
      drwxr-xr-x 12 adamhuan staff 384 8 19 19:41 section
      drwxr-xr-x 12 adamhuan staff 384 8 19 19:49 product
      -rw-r--r-- 1 adamhuan staff 172032 8 20 08:54 db.sqlite3
      -rw-r--r--@ 1 adamhuan staff 53262 8 21 16:39 sqlite_data_20240821.json
      -rw-r--r-- 1 adamhuan staff 38087 8 21 16:45 sqlite_data_20240821.sql
      (base) adamhuan@Leviathan djangoProject__data_search %
      (base) adamhuan@Leviathan djangoProject__data_search % head -n 5 sqlite_data_20240821.sql
      PRAGMA foreign_keys=OFF;
      BEGIN TRANSACTION;
      CREATE TABLE IF NOT EXISTS "django_migrations" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "app" varchar(255) NOT NULL, "name" varchar(255) NOT NULL, "applied" datetime NOT NULL);
      INSERT INTO django_migrations VALUES(1,'contenttypes','0001_initial','2024-08-07 03:44:20.030093');
      INSERT INTO django_migrations VALUES(2,'auth','0001_initial','2024-08-07 03:44:20.035320');
      (base) adamhuan@Leviathan djangoProject__data_search %

      可以看到,已经将SQLite全库导出为SQL文件了。


      03

      Django迁移SQLite数据

      在Django中,要迁移SQLite的数据需要这么做。


      首先,将Django的SQLite的数据导出:

        python manage.py dumpdata > data.json

        这样,就将SQLite的数据导出为文件「data.json」,并存放在Django项目的根目录。


        然后,修改Django的数据库配置为MySQL,或者任何你期望的DB;修改配置文件「settings.py」中的「DATABASES」的配置部分。


        创建表结构:

          python manage.py makemigrations
          python manage.py migrate


          在正式加载前,要确保MySQL的表中是空的:

            # 进入MySQL
            use '你选定的数据库库名'
            delete from auth_permission;
            delete from django_content_type;

            在前面建表之后,上面两个表中是有数据的;

            需要先将其中数据删除,否则在下一步加载数据的过程中,会报错,提示「重复导入数据」


            最后,执行Django的数据加载:

              python manage.py loaddata data.json


              如果依旧还有报错,大部分的可能都是因为字符集导致的错误;

              因此,需要将导出的数据文件「data.json」的编码转换为「UTF-8」,然后,再执行数据加载,就应该没有报错了。





              END




              温馨提示



              如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。


              文章转载自Nephilim,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论