• Django(4):数据库配置和常用命令


    上一章:数据模型定义

    数据存储离不开数据库操作。在Django框架的Web项目开发中,封装数据操作命令可以实现数据模型的无缝迁移。Django对SQLite、PostgreSQL、MySQL和Oracle数据库的支持都非常友好,也支持第三方数据库连接模块的注册。

    数据库连接

    数据库连接配置选项

    数据库配置文件setting.py中,DATABASES是数据库连接配置。以MqSQL数据库为例,配置连接代码如下:

    # 引入MySQL操作模块
    import pymysql
    # Django底层使用MySQLdb操作数据库,这里做一个方法转换
    pymysql.install_as_MySQLdb()
    # 连接核心配置
    DATABASES = {
        'default': {
            # 数据库连接引擎
            'ENGINE': 'django.db.backends.mysql',
            # 连接地址
            'HOST': '',
            # 端口号
            'PORT': 3306,
            # 要连接的数据库名称
            'NAME': 'django-blog',
            # 账号
            'USER': 'root',
            # 密码
            'PASSWORD': '123456',
            # 字符编码
            'CHARSET': '',
            # 数据库连接对象声明周期
            'CONN_MAX_AGE': 0,
            # 事务管理
            'AUTOCOMMIT': True,
        }
    }
    
    • 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

    由于Django底层封装的ORM操作是基于MySQLdb的处理方式,但是MySQLdb不支持最新的pyhton环境和MySQL数据库,所以一般都使用pymysql模块进行替换。因此需要引入pymysql和替换函数install_as_MySQLdb()的操作。

    下面讲解各个选项:

    • ENGINE:数据库连接引擎,内置的有django.db.backends.mysqldjango.db.backends.postgresqldjango.db.backends.sqlite3django.db.backends.oracle。默认是空字符串。
    • HOST:数据库主机IP地址,默认空字符串,表示连接本地地址Localhost。注意它不能与SQLite一起用。
      可以配置目标主机IP,也可以配置UNIX套接字。代码如下:
    "HOST": '192.168.1.100'   # 连接主机配置
    "HOST": '/var/run/mysql'  # 套接字配置
    
    • 1
    • 2
    • PORT:端口,会根据使用的连接引擎自动进行适配。默认空字符串。注意它不能与SQLite一起用。
    • NAME:数据库名称。默认为空字符串。如果连接的是SQLite数据库,则配置的是数据文件的完整路径。
    • USER:用户名。默认空字符串。注意不能与SQLite一起用。
    • PASSWORD:密码。默认空字符串。注意不能与SQLite一起用。
    • CHARSET:连接数据库使用的字符集编码,需要和锁连接的数据库的字符集编码一致。默认为None。
    • CONN_MAX_AGE:数据库连接对象的声明周期,单位为秒(s)。默认为0,表示请求结束时就关闭数据库连接;如果为None,鸟事持久连接,即一旦创建连接,在项目运行期间不关闭。
    • AUTOCOMMIT:开启事务,默认为True。如果不需要Django的内置事务管理,则可设置False。

    在开发中初期,并不需要所有的配置,只需要进行做基本的数据库连接配置,其他配置使用默认值。

    配置多个数据源

    上面例子中,default是默认的数据库连接配置,也可以在项目中添加多个数据库连接配置。代码如下:

    'default': {
       # 默认数据库
       ...
    },
    
    'dev': {
        # 开发数据库
        ...
    },
    'product': {
        # 生产数据库
        ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在使用过程中,可以指定数据库,如下:

    >>> authors = Author.objects.using('dev').all()
    >>>> authors = Author.objects.using('product').all()
    
    • 1
    • 2

    模型数据操作命令

    项目成功连接数据库后,可以通过Django封装的核心命令,让数据模型和数据库中的数据表进行对接。

    有如下命令:

    1.makemigrations

    根据当前项目的数据模型,自动创建目标数据库的同步脚本。执行命令:

    python manage.py makemigrations
    
    • 1

    控制台显示如下:

    # 执行数据同步命令
    python manage.py makemigrations
    # 正在生成author数据库脚本
    Migrations for 'author':
    # 在对应目录下生成0001_initial.py初始化迁移脚本
      author/migrations/0001_initial.py
      # 创建Author数据模型的迁移脚本
        - Create model Author
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.sqlmigrate

    用于查看生成的数据同步脚本,命令格式如下:

    # app_name是模块名;sql_no是脚本的编号
    python manage.py sqlmigrate  
    
    • 1
    • 2

    例如,执行如下命令:

    python manage.py sqlmigrate author 0001
    --
    -- Create model Author
    --
    CREATE TABLE `author_author` (`id` char(32) NOT NULL PRIMARY KEY, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `realname` varchar(20) NOT NULL, `age` integer NOT NULL, `gender` varchar(1) NOT NULL, `email` varchar(254) NULL, `phone` varchar(20) NULL, `status` varchar(5) NOT NULL, `intro` longtext NULL, `remark` longtext NULL);
    CREATE INDEX `author_author_username_ece90b9c` ON `author_author` (`username`);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.migrate

    把SQL脚本同步到数据库中。执行前需要先创建好对应的数据库。

    例如:

    python manage.py migrate               
    Operations to perform:
      Apply all migrations: admin, auth, author, contenttypes, sessions
    Running migrations:
      Applying contenttypes.0001_initial... OK
      Applying auth.0001_initial... OK
      Applying admin.0001_initial... OK
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying admin.0003_logentry_add_action_flag_choices... OK
      Applying contenttypes.0002_remove_content_type_name... OK
      Applying auth.0002_alter_permission_name_max_length... OK
      Applying auth.0003_alter_user_email_max_length... OK
      Applying auth.0004_alter_user_username_opts... OK
      Applying auth.0005_alter_user_last_login_null... OK
      Applying auth.0006_require_contenttypes_0002... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying auth.0009_alter_user_last_name_max_length... OK
      Applying auth.0010_alter_group_name_max_length... OK
      Applying auth.0011_update_proxy_permissions... OK
      Applying auth.0012_alter_user_first_name_max_length... OK
      Applying author.0001_initial... OK
      Applying sessions.0001_initial... OK
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    注意:第一次执行命令时,会自动同步Django内建的数据模型对应的数据表,例如Auth、Sessions等。不影响我们自己建额数据模型迁移。

    4.sqlflush

    查看清空数据库的命令。咋真正清空前,可以查看下具体代码有没有问题,避免误删数据。

    python manage.py sqlflush
    BEGIN;
    SET FOREIGN_KEY_CHECKS = 0;
    TRUNCATE `auth_user_user_permissions`;
    TRUNCATE `django_session`;
    TRUNCATE `auth_permission`;
    TRUNCATE `author_author`;
    TRUNCATE `auth_user`;
    TRUNCATE `auth_group_permissions`;
    TRUNCATE `django_content_type`;
    TRUNCATE `auth_group`;
    TRUNCATE `auth_user_groups`;
    TRUNCATE `django_admin_log`;
    SET FOREIGN_KEY_CHECKS = 1;
    COMMIT;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    5.flush

    执行清空数据库的命令。只清空数据,不删除表。如果希望删除表,则应该重新创建数据库,并重新执行migrate命令。

    python manage.py flush   
    You have requested a flush of the database.
    This will IRREVERSIBLY DESTROY all data currently in the "django-blog" database,
    and return each table to an empty state.
    Are you sure you want to do this?
    
        Type 'yes' to continue, or 'no' to cancel: yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6.dumpata

    执行数据导出操作。主要用于数据迁移,最大有点是兼容所有数据库,比如SQLite中导出的数据可以无缝导入MySQL等其他数据库。

    执行导出:

    >>> python manage.py dumpdata > data.json
    
    • 1

    执行导入:

    >>> python manage.py loaddata data.json 
    Installed 35 object(s) from 1 fixture(s)
    
    • 1
    • 2

    7.dbshell

    进入项目数据库交互模式,可以通过sql语句直接执行增删改查操作。

    8.shell

    Django单元测试交互模式,可以完整的使用Django封装的各种操作公共,如用户数据交互等。

    python manage.py shell  
    Python 3.9.7 (default, Sep 16 2021, 08:50:36) 
    [Clang 10.0.0 ] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可能遇到问题:

    如果出现如下错误

    RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
    
    • 1

    则需要先安装库cryptography,如下命令:

     pip install cryptography
    
    • 1
  • 相关阅读:
    Linux网络编程10——libevent库
    【项目】Http服务器
    2023年中国反射膜产量及市场规模分析:随着太阳能产业快速发展,规模持续扩大[图]
    TypeScript – Pick,Partial,ReturnType类型操作
    CSS中的层叠上下文
    4_Git
    简论UWB三种定位算法的区别
    Scrapy 框架之 Item Pipeline 的使用
    阿赵的Unity可视化Shader工具ASE介绍目录
    美国FBA海运专线究竟是什么?美国fba海运专线都有那些?
  • 原文地址:https://blog.csdn.net/qq_43745578/article/details/127436235