数据库设置
在上一章节中学习了如何创建Django项目,在Django项目中创建web应用,以及如何在Django主程序的URL中引用web应用中的URL。下面来了解如何在Django中使用数据库。Django中想要使用数据库, 首先要了解mysite/mysite/settings.py中关于数据库连接信息选项的设置。
Django默认使用的是sqlite3数据库,sqlite是一个轻量级的基于文件的数据库,因此数据迁移非常方便。多用于单机程序,嵌入式,开发测试demo等。但它不支持数据库用户管理,在同一时间只允许一个写操作所以像一些要求数据用户对数据库的权限设置,对数据库进行并发操作时sqlite就不是我们想要的了,这时我们可以使用MySQL,postgresqlm,Oracle等大型数据库。因为我们要写的是一个投票系统,理论上会有很多用户可以进行投票(哈哈),因此这里我们使用mariadb数据库,它是在MySQL基础上的一个开源的数据库,与MySQL完全兼容。关于mariadb请自行百度。
1、设置mariadb数据库
这里我使用的是yum的方式进行安装的,方便快捷,Django需要MySQL5.6以上的版本,所以这里使用mariadb10.2.31。该版本包含MySQL5.6,MySQL5.7以及一些自有的新的特性。
1.1 设置mariadb的官方yum源
[root@localhost mysite]# vi /etc/yum.repos.d/MariaDB.repo # 添加官方mariadb10.2.31的源 [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.2.31/centos7-amd64/ gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1
如果想要使用其它版本请到官网https://downloads.mariadb.org/自行下载对应版本。
1.2 安装mariadb10.2.31
[root@localhost mysite]# yum install MariaDB-server MariaDB-client -y
安装完成后,你应该能看到如下界面:
1.3 mariadb服务管理
在centos 7中通过yum安装的程序我们都可以使用systemctl工具来对其服务进行管理
[root@localhost ~]# systemctl start mariadb // 开启mysql服务 [root@localhost ~]# systemctl stop mariadb // 停止mysql服务 [root@localhost ~]# systemctl restart mariadb // 重启mysql服务 [root@localhost ~]# systemctl enable mariadb // 设置开机启动 [root@localhost ~]# systemctl disable mariadb // 禁止开机启动
1.4 初始化mariadb数据库
MariaDB 安装完毕并成功启动后为了确保数据库的安全性和正常运转,需要先对数据库程序进行初始化操作。
1 [root@localhost ~]# systemctl start mariadb // 启动mysql服务 2 [root@localhost ~]# mysql_secure_installation // 初始化mysql数据库 3 4 // 进入mariadb的初始化配置模式 5 NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB 6 SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! 7 8 In order to log into MariaDB to secure it, we'll need the current 9 password for the root user. If you've just installed MariaDB, and 10 you haven't set the root password yet, the password will be blank, 11 so you should just press enter here. 12 13 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 14 Enter current password for root (enter for none): // 这里输入mysql数据库root密码,默认没有密码 15 OK, successfully used password, moving on... 16 17 Setting the root password ensures that nobody can log into the MariaDB 18 root user without the proper authorisation. 19 20 Set root password? [Y/n] y // 是否为mysql数据库root用户设置密码,这里我们设置密码 21 New password: // 输入要设置的密码 22 Re-enter new password: // 确认输入的密码 23 Password updated successfully! 24 Reloading privilege tables.. 25 ... Success! 26 27 28 By default, a MariaDB installation has an anonymous user, allowing anyone 29 to log into MariaDB without having to have a user account created for 30 them. This is intended only for testing, and to make the installation 31 go a bit smoother. You should remove them before moving into a 32 production environment. 33 34 Remove anonymous users? [Y/n] y // 是否要删除匿名用户,这里删除掉。要不然可以在不输入用户名和密码的情况下登陆数据库 35 ... Success! 36 37 Normally, root should only be allowed to connect from 'localhost'. This 38 ensures that someone cannot guess at the root password from the network. 39 40 Disallow root login remotely? [Y/n] n // 是否拒绝root用户从远程登陆数据库,这里允许root用户远程登陆数据库 41 ... skipping. 42 43 By default, MariaDB comes with a database named 'test' that anyone can 44 access. This is also intended only for testing, and should be removed 45 before moving into a production environment. 46 47 Remove test database and access to it? [Y/n] y // 是否删除mysql自带的test测试数据库,这里没什么用就删除了吧 48 - Dropping test database... 49 ... Success! 50 - Removing privileges on test database... 51 ... Success! 52 53 Reloading the privilege tables will ensure that all changes made so far 54 will take effect immediately. 55 56 Reload privilege tables now? [Y/n] y // 是否立即生效,这里立即生效 57 ... Success! 58 59 Cleaning up... 60 61 All done! If you've completed all of the above steps, your MariaDB 62 installation should now be secure. 63 64 Thanks for using MariaDB! 65 66 mariadb数据库的初始化
1.5 配置mariadb数据库的编码
mariadb的默认数据库编码是拉丁文,如果你不信我们登陆数据库看一下:
[root@localhost mysite]# mysql -uroot -p # 登录数据库
MariaDB [(none)]> \s # 登录数据库后输入\s查看mariadb服务的状态信息
我们需要调整下my.cnf的配置文件
[root@localhost bin]# vim /etc/my.cnf
[mysqld] character-set-server=utf8 // 设置服务端的字符集 collation-server=utf8_general_ci // 设置服务端的字符集 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid [client] // 设置客户端的字符集 default-character-set=utf8 [mysql] // 设置客户端的字符集 default-character-set=utf8 # # include all files from the config directory # !includedir /etc/my.cnf.d
设置好字符集后,重启mariadb,登录数据库验证字符集
[root@localhost mysite]# systemctl restart mariadb
[root@localhost mysite]# mysql -uroot -p # 登录数据库
MariaDB [(none)]> \s # 登录数据库后输入\s查看mariadb服务的状态信息
数据库设置到这里算是告一段落,但事情并没有结束,我们还需要为我们的Django程序创建一个 数据库,以及操作这个数据库的用户。
1.6 创建数据库mysqite,并为数据库分配用户。
MariaDB [(none)]> create database mysite; # 为我们的Django程序创建mysite数据库
# 为mysite数据库创建一个mysite_user用户,该用户对数据库拥有所有权限,并且可以在任意主机访问该数据库 # 虽然这么做是不安全的,但现在是初学暂且就这么设置吧 MariaDB [(none)]> grant all on mysite.* to mysite_user@'%' identified by '用户密码'; # 为数据库分配用户 MariaDB [(none)]> flush privileges; # 更新权限,使设置生效
好了我们已经创建好了数据库:mysite,数据库用户:mysite_user 并且允许该用户在任意主机访问该数据库。
1.7 验证是否可以远程连接数据库mysite
在运行一台主机尝试远程登录数据库查看,是否可以登录,为确保可以登录建议关闭防火墙,如果一切顺利你会看到:
到目前为止,数据库操作就到这里。下面到settings.py中进行设置
2、设置mysite/mysite/settings.py
[root@localhost mysite]# vim mysite/settings.py
如果我们使用的是sqlite3数据库,那么就不需要像上面那样设置数据库及修改settings.py就可以直接使用数据库了,但我们要使用的是mariadb,所以我们还需要修改这段配置。
1 [root@localhost mysite]# vim mysite/settings.py 2 DATABASES = { 3 'default': { 4 'ENGINE': 'django.db.backends.mysql', 5 'HOST': '192.168.10.100', 6 'PORT': 3306, 7 'NAME': 'mysite', 8 'USER': 'mysite_user', 9 'PASSWORD': '123.abc', 10 } 11 }
修改后的settings.py看起来像下面这样:
[root@localhost mysite]# vim mysite/settings.py # 设置数据库连接选项
数据库连接设置好后,你还需要做一件事,那就是设置Django的时区,Django默认的时区是UTC,我们需要将时区改成中国的,所以你需要在settings.py中找到TIME_ZONE选项并改正。修改后的样子如下:
到此settings.py配置就告一段落。我们通过Django以ORM的方式在数据库中创建表。
3、创建models(在数据库中建表)
我们在来看一下mysite项目的结构:
再来看一下web应用polls的结构:
上一章节我们只是简单的创建了应用polls,并对其进行访问,如果我们想要polls目录下的models.py能够在数据库中创建表,还需要在主程序的settings.py中将我们的polls应用注册进去才可以。
因为Django是通过 python manage.py migrate来创建表的,该命令会将settings.py中的INSTALLED_APPS中注册的应用结合DATABASES中的数据库连接信息,并根据INSTALLED_APPS中注册应用的models.py进行数据的迁移(也就是创建表)。所以我们需要将polls应用注册到settings.py的INSTALLED_APPS选项中。
[root@localhost mysite]# vim mysite/settings.py # 像配置文件中注册polls应用
注册后的文件看起来像下面这样:
好了现在我们可以到polls/models.py中去创建表了,
创建表前先简单的设计一下我们的这个投票程序。我们将创建两个模型:问题和选择。
- 问题模型中有两个字段:问题字段和问题的发布日期字段。
- 选择模型中有三个字段:一个关联问题模型的外键(一个问题对应一个选择投票的权利),选择的文本和投票计数。
当我们设计好表结构后就可以动手在models.py中去创建表了,models.py中的类相当于数据库当中的表,类的特殊之处在于需要继承Django为我们提供的models.Model。然后类中的属性就相当于数据库中的字段,如果没有接触过ORM也许会对这种创建表的方式感到不解,不过随着不断的学习我相信会慢慢了解的。
我的models.py看起来像下面这样
[root@localhost mysite]# vim polls/models.py # 在此处创建表 from django.db import models # Create your models here. class Question(models.Model): # 问题表 question_text = models.CharField(max_length=200) pub_data = models.DateTimeField('date published') class Choice(models.Model): # 选择表 question = models.ForeignKey(Question,on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
到这里我们不要停歇还差一步就可以了,虽然前边又是配置数据库连接信息,又是注册应用的,但我们现在还是无法连接数据库,因为python使用mariadb数据库还需要一些第三方模块的辅助,这里我们使用mysqlclient模块。安装过程中可能会遇到很多问题,不过我这里都解决了,我就不带着大家一步步入坑了。直接把坑填好:
[root@localhost ~]# pip3 install --upgrade pip # 先升级pip [root@localhost ~]# yum install MariaDB-shared MariaDB-devel python3-devel -y # 安装mariadb的动态库和静态库和python3对应的库 [root@localhost ~]# pip3 install mysqlclient
现在可以说是万事俱备只欠东风了,在数据库mysite中创建表(执行数据迁移)
[root@localhost mysite]# python3 manage.py migrate # 执行数据迁移(创建Django所需的表,而不是我们models.py中的表)
如果一切顺利,你会看到如下:
[root@localhost mysite]# python3 manage.py makemigrations # 将models.py中更新的数据写入到polls/migrations/xxxx_initial.py中)
我们可以执行如下命令来查看Django刚刚都为我们都做了什么:
[root@localhost mysite]# python3 manage.py sqlmigrate polls 0001
执行数据迁移(在数据库中建表)
[root@localhost mysite]# python3 manage.py migrate #该命令会读取polls/migrations/xxxx_initial.py中的内容,连接数据库执行里面更新后的sql语句
验证:到数据库中验证是否创建了表
[root@localhost mysite]# mysql -uroot -p # 登录数据库 MariaDB [(none)]> use mysite; MariaDB [mysite]> show tables;
你会看到如下表:
好啦,关于数据库就先到这里吧,下一章节将了解Django为我们提供的admin后台。
本文参考文档:https://docs.djangoproject.com/en/2.2/intro/tutorial02/
下一篇:初识Django admin:javascript:void(0)