被解放的姜戈02 庄园疑云
上一回说到,姜戈的江湖初体验:如何架设服务器,如何回复http请求,如何创建App。这一回,我们要走入糖果庄园。
数据库是一所大庄园,藏着各种宝贝。一个没有数据库的网站,所能提供的功能会非常有限。
为了找到心爱的人,姜戈决定一探这神秘的糖果庄园。
连接数据库
Django为多种数据库后台提供了统一的调用API。根据需求不同,Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接。
在Linux终端下启动mysql:
$mysql -u root -p
在MySQL中创立Django项目的数据库:
mysql> CREATE DATABASE villa DEFAULT CHARSET=utf8;
这里使用utf8作为默认字符集,以便支持中文。
在MySQL中为Django项目创立用户,并授予相关权限:
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON villa.* TO 'vamei'@'localhost' IDENTIFIED BY 'vameiisgood';
在settings.py中,将DATABASES对象更改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'villa',
'USER': 'vamei',
'PASSWORD': 'vameiisgood',
'HOST':'localhost',
'PORT':'3306',
}
}
后台类型为mysql。上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。此后,Django就可以在数据库中读写了。
姜戈略一迟疑,旋即走入了庄园的大门。
创立模型
MySQL是关系型数据库。但在Django的帮助下,我们不用直接编写SQL语句。Django将关系型的表(table)转换成为一个类(class)。而每个记录(record)是该类下的一个对象(object)。我们可以使用基于对象的方法,来操纵关系型的MySQL数据库。
在传统的MySQL中,数据模型是表。在Django下,一个表为一个类。表的每一列是该类的一个属性。在models.py中,我们创建一个只有一列的表,即只有一个属性的类:
from django.db import models
class Character(models.Model):
name = models.CharField(max_length=200)
def __unicode__(self):
return self.name
类Character定义了数据模型,它需要继承自models.Model。在MySQL中,这个类实际上是一个表。表只有一列,为name。可以看到,name属性是字符类型,最大长度为200。
类Character有一个__unicode__()方法,用来说明对象的字符表达方式。如果是Python 3,定义__str__()方法,实现相同的功能。
命令Django同步数据库。Django根据models.py中描述的数据模型,在MySQL中真正的创建各个关系表:
$python manage.py syncdb
同步数据库后,Django将建立相关的MySQL表格,并要求你创建一个超级用户:
Creating tables ... Creating table django_admin_log Creating table auth_permission Creating table auth_group_permissions Creating table auth_group Creating table auth_user_groups Creating table auth_user_user_permissions Creating table auth_user Creating table django_content_type Creating table django_session Creating table west_character You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (leave blank to use 'tommy'): vamei Email address: vamei@vamei.com Password: Password (again): Superuser created successfully. Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s)
数据模型建立了。打开MySQL命令行:
$mysql -u vamei -p
查看数据模型:
USE villa;
SHOW TABLES;
SHOW COLUMNS FROM west_character;
最后一个命令返回Character类的对应表格:
+-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(200) | NO | | NULL | | +-------+--------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec)
可以看到,Django还自动增加了一个id列,作为记录的主键(Primary Key)。
这富丽堂皇的别墅中,姜戈隐隐闻到凶险的味道。
显示数据
数据模型虽然建立了,但还没有数据输入。为了简便,我们手动添加记录。打开MySQL命令行,并切换到相应数据库。添加记录:
INSERT INTO west_character (name) Values ('Vamei');
INSERT INTO west_character (name) Values ('Django');
INSERT INTO west_character (name) Values ('John');
查看记录:
SELECT * FROM west_character;
可以看到,三个名字已经录入数据库。
下面我们从数据库中取出数据,并返回给http请求。在west/views.py中,添加视图。对于对应的请求,我们将从数据库中读取所有的记录,然后返回给客户端:
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from west.models import Character
def staff(request):
staff_list = Character.objects.all()
staff_str = map(str, staff_list)
return HttpResponse("<p>" + ' '.join(staff_str) + "</p>")
可以看到,我们从west.models中引入了Character类。通过操作该类,我们可以读取表格中的记录
为了让http请求能找到上面的程序,在west/urls.py增加url导航:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^staff/','west.views.staff'),
)
运行服务器。在浏览器中输入URL:
127.0.0.1:8000/west/staff
查看效果:
从数据库读出数据,显示在页面
“我心爱的人,原来你在这里。” 姜戈强自镇定,嘴角忍不住颤动。
总结
Django使用类和对象接口,来操纵底层的数据库。
有了数据库,就有了站点内容的大本营。
姜戈,风雨欲来。
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](九)
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](八)
- 第二届ZCTF逆向题分析(一)
- 渗透测试时,需要注意浏览器选项
- 渗透测试时,需要注意浏览器选项
- 码云 Android apk 在线构建功能上线啦
- addslashes防注入的绕过案例(AFSRC获奖白帽子情痴)
- Hive表字段Comment中文乱码
- 在Win10上是用Anaconda搭建TensorFlow开发环境
- A Gentle Introduction to Autocorrelation and Partial Autocorrelation (译文)
- A Gentle Introduction to Applied Machine Learning as a Search Problem (译文)
- 技术创新,基于 React Native 的开源项目 | 码云周刊第 17 期
- How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python 译文
- ssctf2017_WriteUp
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java8 Stream
- 性能测试必备知识(4)- 使用 stress 和 sysstat 分析平均负载过高的场景
- 高并发利器-guava分流与缓存
- 树莓派3b+组装+烧录retropie系统
- 使用Azure DevOps Pipeline实现.Net Core程序的CI
- 带你遨游USB世界
- C# 泛型中的数据类型判定与转换
- 评测Loki日志工具
- .Net微服务实战之负载均衡(上)
- ES 7.8 速成笔记(上)
- 利用Xtrabackup进行mysql增量备份和全量备份
- ES 7.8 速成笔记(中)
- 什么?字符串为空?
- PowerBI DAX 计算组 基础篇
- 45. Vue路由vue-router的基本使用