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 安装完毕并成功启动后为了确保数据库的安全性和正常运转,需要先对数据库程序进行初始化操作。
[root@localhost ~]# systemctl start mariadb // 启动mysql服务
[root@localhost ~]# 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的默认数据库编码是拉丁文,如果你不信我们登陆数据库看一下:
[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,所以我们还需要修改这段配置。
[root@localhost 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看起来像下面这样:
[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:https://www.cnblogs.com/caesar-id/p/12322905.html
3-在Django中使用使用数据库的更多相关文章
- Django中使用mysql数据库并使用原生sql语句操作
Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件mysql数据库,版本5.7 ...
- django 中连接mysql数据库的操作步骤
django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mys ...
- Django中ORM对数据库的增删改查
Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...
- Django中把SQLite数据库转换为Mysql数据库的配置方法
我们在学习和开发Django的时候,一般是使用SQLite作为数据库.在正式讲网站部署上线是用MySQL数据库比较多.MySQL支持高并发的访问,而且相对于SQLite,MySQL性能更好.下面讲讲如 ...
- django中使用mysql数据库的事务
django中怎么使用mysql数据库的事务 Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起 ...
- python django中使用sqlite3数据库 存储二进制数据ByteArray
在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...
- Django中ORM对数据库的增删改查操作
前言 什么是ORM? ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...
- django中 对Mysql数据库的建表
Django操作Mysql数据库: 1.1 在settings中,配置数据库相关参数,所以无需修改,这里我们看一下: DATABASES = { 'default': { # 这里可以指定使用的数据库 ...
- Django中使用MySQL数据库的连接配置
1. 安装pymysql pip install pymysql 2. 导入 # 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置 import pymysql ...
- 如何在Django中配置MySQL数据库
直接上图 在项目中直接找到settings 文件 第一步 原始Django自带数据库 第二步将配置改成MySQL的数据 第三步 在__init__文件中告知Django使用MySQL数据 ...
随机推荐
- Windows2008R2 一键安全优化脚本
::author vim ::QQ 82996821 ::filename Windows2008R2_safe_auto_set.bat :start @echo off color 0a ...
- USB-Blaster CPLD FPGA Intel 驱动安装不上的问题,文件的哈希值不在指定的目录文件中,的解决办法,其实很简单
intel的官网的驱动安装文档: https://www.intel.com/content/www/us/en/programmable/support/support-resources/down ...
- opencv —— imread、namedWindow & imshow、cvtColor、imwrite 加载、显示、修改、保存图像
加载图像:imread 函数 Mat imread(const string& filename, int flags = 1): filename:需要载入的图像的路径名. flags:加载 ...
- Windows配置JDK环境
在系统变量里新建JAVA_HOME变量,变量值为:D:\Program Files\Java\jdk1.8.0_161(根据自己的安装路径填写) 在系统变量里新建classpath变量,变量值为:;% ...
- python学习随笔2:python判断和循环
1.if-else _username = 'heyue' _password = ' username = input("username:") password = input ...
- Python学习笔记--协程asyncio
协程的主要功能是单线程并发运行 假设有3个耗时不一样的任务.看看协程的效果. 先来看没有使用协程情况: #!/usr/bin/python3 # -*- coding:utf-8 -*- import ...
- 三种比较好玩的黑客效果JS代码(摘取)
<html> <head> <title>The Matrix</title> <script src="http://ajax.goo ...
- Fabric智能合约(base)
这里的智能合约仅包含Init函数和Invoke函数. 为什么一定是这两个方法? 因为在源码中的智能合约模块有这样的接口,如果要完成智能合约的相关编程,就需要实现源码中定义的接口,接口中定义了这两个方法 ...
- List和DataTable互转
/// <summary> /// List和DataTable互转 /// </summary> static class ListUtility { /// <sum ...
- 树莓派pip安装opencv报错,Could not find a version that satisfies the requirement cv2 (from versions: )No matching distribution found for cv2
前言 我在使用pip install opencv-python 时报错 Could not find a version that satisfies the requirement opencv ...