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,
    }
}

由于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'  # 套接字配置
  • PORT:端口,会根据使用的连接引擎自动进行适配。默认空字符串。注意它不能与SQLite一起用。
  • NAME:数据库名称。默认为空字符串。如果连接的是SQLite数据库,则配置的是数据文件的完整路径。
  • USER:用户名。默认空字符串。注意不能与SQLite一起用。
  • PASSWORD:密码。默认空字符串。注意不能与SQLite一起用。
  • CHARSET:连接数据库使用的字符集编码,需要和锁连接的数据库的字符集编码一致。默认为None。
  • CONN_MAX_AGE:数据库连接对象的声明周期,单位为秒(s)。默认为0,表示请求结束时就关闭数据库连接;如果为None,鸟事持久连接,即一旦创建连接,在项目运行期间不关闭。
  • AUTOCOMMIT:开启事务,默认为True。如果不需要Django的内置事务管理,则可设置False。

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

配置多个数据源

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

'default': {
   # 默认数据库
   ...
},

'dev': {
    # 开发数据库
    ...
},
'product': {
    # 生产数据库
    ...
}

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

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

模型数据操作命令

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

有如下命令:

1.makemigrations

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

python manage.py makemigrations

控制台显示如下:

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

2.sqlmigrate

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

# app_name是模块名;sql_no是脚本的编号
python manage.py sqlmigrate <app_name> <sql_no>

例如,执行如下命令:

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`);

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

注意:第一次执行命令时,会自动同步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;

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

6.dumpata

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

执行导出:

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

执行导入:

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

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)
>>> 

可能遇到问题:

如果出现如下错误

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

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

 pip install cryptography
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethan-running

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值