上一章:数据模型定义
数据存储离不开数据库操作。在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()的操作。
下面讲解各个选项:
django.db.backends.mysql
、django.db.backends.postgresql
、django.db.backends.sqlite3
、django.db.backends.oracle
。默认是空字符串。"HOST": '192.168.1.100' # 连接主机配置
"HOST": '/var/run/mysql' # 套接字配置
在开发中初期,并不需要所有的配置,只需要进行做基本的数据库连接配置,其他配置使用默认值。
上面例子中,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
例如,执行如下命令:
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