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

Posted caesar-id

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3-在Django中使用使用数据库相关的知识,希望对你有一定的参考价值。

数据库设置

在上一章节中学习了如何创建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, well need the current
 9 password for the root user.  If youve just installed MariaDB, and
10 you havent 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 youve completed all of the above steps, your MariaDB
62 installation should now be secure.
63 
64 Thanks for using MariaDB!
65 
66 mariadb数据库的初始化
初始化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
my.cnf

 

设置好字符集后,重启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数据库部分设置

 

修改后的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能够在数据库中创建表,还需要在主程序的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中去创建表了,创建表前先简单的设计一下我们的这个投票程序。

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

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

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

 

以上是关于3-在Django中使用使用数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django视图中使用for循环返回每次迭代[关闭]

如何在扩展另一个文件的 django 模板中使用带有动态内容的 html 块片段?

如何在 Django 中显式重置模板片段缓存?

如何使用引导程序和 for 循环在 django 中创建电影片段?

(Django)气流中的 ORM - 有可能吗?

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段