3-在Django中使用使用数据库

hanshangzhi 2020-02-17

数据库设置

在上一章节中学习了如何创建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源

[ 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

[ mysite]# yum install MariaDB-server MariaDB-client -y 

安装完成后,你应该能看到如下界面:

3-在Django中使用使用数据库

1.3 mariadb服务管理

在centos 7中通过yum安装的程序我们都可以使用systemctl工具来对其服务进行管理

[ ~]# systemctl start mariadb     // 开启mysql服务
[ ~]# systemctl stop mariadb      // 停止mysql服务
[ ~]# systemctl restart mariadb   // 重启mysql服务
[ ~]# systemctl enable mariadb    // 设置开机启动
[ ~]# systemctl disable mariadb   // 禁止开机启动

1.4 初始化mariadb数据库

MariaDB 安装完毕并成功启动后为了确保数据库的安全性和正常运转,需要先对数据库程序进行初始化操作。

[ ~]# systemctl start mariadb     // 启动mysql服务
[ ~]# mysql_secure_installation   // 初始化mysql数据库

// 进入mariadb的初始化配置模式
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we‘ll need the current
password for the root user.  If you‘ve just installed MariaDB, and
you haven‘t set the root password yet, the password will be blank,
so you should just press enter here.

ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
Enter current password for root (enter for none):    // 这里输入mysql数据库root密码,默认没有密码
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y     //  是否为mysql数据库root用户设置密码,这里我们设置密码
New password:    // 输入要设置的密码
Re-enter new password:   // 确认输入的密码
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y   //  是否要删除匿名用户,这里删除掉。要不然可以在不输入用户名和密码的情况下登陆数据库
 ... Success!

Normally, root should only be allowed to connect from ‘localhost‘.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] n   // 是否拒绝root用户从远程登陆数据库,这里允许root用户远程登陆数据库
 ... skipping.

By default, MariaDB comes with a database named ‘test‘ that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y   // 是否删除mysql自带的test测试数据库,这里没什么用就删除了吧
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y   // 是否立即生效,这里立即生效
 ... Success!

Cleaning up...

All done!  If you‘ve completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

mariadb数据库的初始化

初始化mariadb

1.5 配置mariadb数据库的编码
mariadb的默认数据库编码是拉丁文,如果你不信我们登陆数据库看一下:

[ mysite]# mysql -uroot -p  # 登录数据库MariaDB [(none)]> \s     # 登录数据库后输入\s查看mariadb服务的状态信息

3-在Django中使用使用数据库

我们需要调整下my.cnf的配置文件

[ 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

my.cnf

设置好字符集后,重启mariadb,登录数据库验证字符集

[ mysite]# systemctl restart mariadb[ mysite]# mysql -uroot -p  # 登录数据库MariaDB [(none)]> \s     # 登录数据库后输入\s查看mariadb服务的状态信息

3-在Django中使用使用数据库

数据库设置到这里算是告一段落,但事情并没有结束,我们还需要为我们的Django程序创建一个 数据库,以及操作这个数据库的用户。

1.6 创建数据库mysqite,并未数据库分配用户。

MariaDB [(none)]> create database mysite;  # 为我们的Django程序创建mysite数据库
# 为mysite数据库创建一个mysite_user用户,该用户对数据库拥有所有权限,并且可以在任意主机访问该数据库
# 虽然这么做是不安全的,但现在是初学暂且就这么设置吧
MariaDB [(none)]> grant all on mysite.* to ‘%‘ identified by ‘用户密码‘;  # 为数据库分配用户
MariaDB [(none)]> flush privileges;   # 更新权限,使设置生效

好了我们已经创建好了数据库:mysite,数据库用户:mysite_user 并且允许该用户在任意主机访问该数据库。

1.7 验证是否可以远程连接数据库mysite

在运行一台主机尝试远程登录数据库查看,是否可以登录,为确保可以登录建议关闭防火墙,如果一切顺利你会看到:

3-在Django中使用使用数据库

到目前为止,数据库操作就到这里。下面到settings.py中进行设置

2、设置mysite/mysite/settings.py

[ mysite]# vim mysite/settings.py

3-在Django中使用使用数据库

如果我们使用的是sqlite3数据库,那么就不需要像上面那样设置数据库及修改settings.py就可以直接使用数据库了,但我们要使用的是mariadb,所以我们还需要修改这段配置。

[ mysite]# vim mysite/settings.py
DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘HOST‘: ‘192.168.10.100‘,
        ‘PORT‘: 3306,
        ‘NAME‘: ‘mysite‘,
        ‘USER‘: ‘mysite_user‘,
        ‘PASSWORD‘: ‘123.abc‘,
    }
}

settings.py数据库部分设置

修改后的settings.py看起来像下面这样:

[ mysite]# vim mysite/settings.py  # 设置数据库连接选项

3-在Django中使用使用数据库

数据库连接设置好后,你还需要做一件事,那就是设置Django的时区,Django默认的时区是UTC,我们需要将时区改成中国的,所以你需要在settings.py中找到TIME_ZONE选项并改正。修改后的样子如下:

3-在Django中使用使用数据库

到此settings.py配置就告一段落。我们通过Django以ORM的方式在数据库中创建表。

3、创建models(在数据库中建表)

我们在来看一下mysite项目的结构:

3-在Django中使用使用数据库

再来看一下web应用polls的结构:

3-在Django中使用使用数据库

上一章节我们只是简单的创建了应用polls,并对其进行访问,如果我们想要polls能够在数据库中创建表,还需要在主程序的settings.py中将我们的polls注册进去才可以。

因为Django是通过 python manage.py migrate来创建表的,该命令会将settings.py中的INSTALLED_APPS中注册的应用结合DATABASES中的数据库连接信息,并根据INSTALLED_APPS中注册应用的models.py进行数据的迁移(也就是创建表)。所以我们需要将polls应用注册到settings.py的INSTALLED_APPS选项中。

[ mysite]# vim mysite/settings.py # 像配置文件中注册polls应用

注册后的文件看起来像下面这样:

3-在Django中使用使用数据库

好了现在我们可以到polls/models.py中去创建表了,创建表前先简单的设计一下我们的这个投票程序。

我们将创建两个模型:问题和选择。

问题模型中有两个字段:问题字段和问题的发布日期字段。

选择模型中有三个字段:一个关联问题模型的外键(一个问题对应一个选择),选择的文本和投票计数。

相关推荐

inspuryhq / 0评论 2020-07-28