Django来敲门~第一部分【5.2.模型和数据库交互】

为学日益。为道日损。损之又损,以至於无为。无为而不为。 ——老子《道德经》

书接上文,我们继续

2. 数据库配置【MySQL】

通常情况下,如果你只是做测试使用,可以使用Django内置的数据库SQLite就完全可以满足需要了,我们在本次教程中,通过使用MySQL这个数据库来完成后续的功能操作

我们首先要做的是,在配置文件中指定数据库的配置,先简单了解一下

数据库配置,首先要配置对应的数据库引擎对象和数据库连接信息 在DATABASES的default配置中进行默认配置

  • ENGINE:数据库引擎配置,可以从django.db.backends.sqlite3django.db.backends.postgresqldjango.db.backends.mysql或者django.db.backends.oracle中选择一个
  • NAME:数据库名称,也就是我们项目要连接的数据库名称,如果使用默认的SQLite,数据库就是一个保存在我们电脑上的文件,NAME就必须指定绝对路径(当然这是废话,Django已经帮我们把这些事情都做好了)
  • 同时还可以使用USERPASSWORDHOST等等这些配置来配置更加详细的信息

注意:如果在项目中使用的数据库不是默认的SQLite,请确保你的数据库是存在的

废话不说,上干货 打开mysite/mysite/settings.py配置文件,添加数据库连接配置信息

# 引入pymysql模块
import pymysql
# 指定按照mysqldb的方式使用
pymysql.install_as_MySQLdb()

# 修改DATABASES配置
DATABASES = {
    'default': {
        # 数据库连接字符串
        'ENGINE':"django.db.backends.mysql",
        # 数据库名称
        "NAME":"pydb",
        # 数据库登录账号
        "USER":"root",
        # 数据库登录密码
        "PASSWORD":"",
        # 数据库所在主机IP,本机可以不用填写
        "HOST":"",
        # 数据库连接端口,MySQL默认3306
        "PORT":"3306"
    }
}

这里需要注意,大家可以看到,在mysite/mysite/settings.py文件的开头,引入了pymysql并且调用了它的方法install_as_MySQLdb() 这是因为Django常规情况下使用的mysqldb模块来连接数据库,但是python3.4+的版本还没有对应的mysqldb,目前使用的是第三方的pymysql模块,所以这里进行了这样的改造。

骚年,期待你在使用到时候,官方能提供和Python3.6配套的mysqldb来进行数据库操作。或者你直接参与到官方的开发队伍中,那就更完美了~

3. 创建模型应用并和数据库交互

3.1. 创建模型对象

常规情况下,我们需要在程序中,通过类和对象来封装我们的数据,方便数据的统一管理和使用,Django中对模型对象的规范做的更加的统一了,通常情况下将模块应用对象会常见在应用的模块应用/models.py文件中

废话不说,直接上干货: 在我们mysite项目的polls应用中,创建模型对象

# 引入django.db模块中的models模块
from django.db import models

# 创建一个**问题**类型
class Question(models.Model):
    # 创建一个问题描述属性,指定为字符串类型,最大长度200个字符
    question_text = models.CharField(max_length = 200)
    # 创建一个发布时间属性,指定为日期时间类型
    pub_date = models.DateTimeField("date published")

# 创建一个**解决方案**类型
class Choice(models.Model):
    # 将解决方案和问题关联起来,通过外键的形式
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    # 解决方案的描述信息,字符串,最大长度200
    choice_text = models.CharField(max_length=200)
    # 解决方案的投票总数,整数类型,默认0
    votes = models.IntegerField(default = 0)
3.2. 管理模型对象

一旦创建好了我们的模型类型,需要在项目中使用这些模型和数据库中的数据进行交互,首先我们要做的是~将我们模块应用polls纳入到项目管理中

很神奇的一句话:“纳入到项目管理中”,难道之前就木有在项目管理中吗?那我们是在启动项目后怎么访问到polls引用的视图的呢?!

换一句话大家可能就明白了,你作为中华人民共和国的一等良民,国家财政会给你发补贴福利吗?不会!但是如果把你纳入到国家的编制中,你就可以享受国家财政给你发放的工资补贴福利等等资源了,这里也是一样,前面创建的polls应用只是项目中的一部分,我们只有通过类似编制的东东让项目mysitepolls添加一个编制,项目就可以处理模块应用polls/中的模型数据了

在我们项目中,通过项目的mysite/mysite/settings.py配置文件的INSTALLED_APPS选项来进行项目应用的管理 默认情况下mysite/mysite/settings.py配置信息如下

INSTALLED_APPS = [
    'django.contrib.admin',# 默认提供的后台管理网站
    'django.contrib.auth',# 权限认证模块
    'django.contrib.contenttypes',#内容编码框架模块
    'django.contrib.sessions',# session回话管理框架模块
    'django.contrib.messages',# 消息队列处理模块
    'django.contrib.staticfiles',# 项目静态文件管理模块
]

我们要做的是什么呢,打开模块应用polls/app.py应用描述文件,可以看到里面定义了模块应用的名称,对,说的就是它!!!!

from django.apps import AppConfig
# 模块应用的名称
class PollsConfig(AppConfig):
    name = 'polls'

我们修改mysite/mysite/settings.py配置文件,添加模块应用

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',# 默认提供的后台管理网站
    'django.contrib.auth',# 权限认证模块
    'django.contrib.contenttypes',#内容编码框架模块
    'django.contrib.sessions',# session回话管理框架模块
    'django.contrib.messages',# 消息队列处理模块
    'django.contrib.staticfiles',# 项目静态文件管理模块
]

至此~配置部分就完全OK啦

3.3. 使用模型对象

上面项目部分开发配置完成后,我们Django能做什么呢?

  • 自动创建模块应用中模型对应的数据表(Create Table <table_name>)
  • 自动生成访问Question和Choice模型对象的API接口

这么神奇?上干货: 执行如下命令,进行数据库同步:

python3 manage.py makemigrations polls

执行的结果你会看到:

makemigrations执行结果 运行makemigrations命令,就是告诉Django我们对指定的模型,如polls,进行了什么改变,并将这些改变信息存储起来

migrations会将这些改变信息保存在模块应用的migraions文件夹下,如上面的操作会生成这样一个文件:mysite/polls/migrations/0001_initial.py,打开直接就可以看到具体的描述信息了。

我们再填一把火,查看Django自动给我们创建的SQL语句吧

# 执行sqlmigrate命令得到刚才执行makemigrations命令生成的sql语句
python3 manage.py sqlmigrate polls 0001

执行结果如下:

D:\resp_work\PY_WORK\mysite>python3 manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Choice
--
CREATE TABLE `polls_choice` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`choice_text` varchar(200) NOT NULL,
`votes` integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE `polls_question` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`question_text` varchar(200) NOT NULL,
`pub_date` datetime(6) NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL;

ALTER TABLE `polls_choice`
ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id`
FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`);

COMMIT;

我们会看到一个很神奇的结果,我们创建的Question和Choice模型数据,被Django自动转换成了SQL语句了

注意问题:由migrations引发的臆想

  • 由makemigrations根据模型自动生成的sql语句,严重依赖指定的数据库,切记这样的SQL不是通用的,这里生成的SQL语句只能用于MySQL数据库
  • 主键是自动增长的(当然你也可以修改不让自动增长),并且会根据指定的数据库自动匹配,如auto_increment(MySQL)serial(PostgreSQL)integer primary key autoincrement(SQLite)等等
  • 默认情况下Django会自动给外键增加_id的形式命名(同样可以修改哦)
  • 最重要的是:makemigrations或者sqlmigrate命令,都不会在目标数据库自动执行,也就是SQL语句有了,但是还没有执行。这是为什么呢?因为毕竟自动的东西不一定满足需要~我们简单修改一下SQL然后执行,这样更加符合实际开发哦
  • 当然,如果不需要修改SQL,直接执行的话,运行python3 manage.py migrate命令就可以将改动应用到数据库了
3.4. 使用模型对象的API操作

在命令行通过shell启动应用,就可以直接进行python根据模型应用提供的API接口的访问测试了 执行如下命令:

python3 manage.py shell

就可以在命令行中,进行API的测试了

D:\resp_work\PY_WORK\mysite>python3 manage.py shell
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> Question.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'Question' is not defined
>>>
>>> from polls.models import Question, Choice
>>> Question.objects.all()# 查看所有的问题对象列表
<QuerySet []>
>>>
>>> from django.utils import timezone # 引入时区模块
>>> q = Question(question_text="What's new?", pub_date=timezone.now())# 创建一个问题对象
>>> q.save() # 保存到数据库
>>> q.id # 查看q对象的主键字段
1
>>> q.question_text# 查看q对象的问题描述字段
"What's new?"
>>> q.pub_date # 查看q对象的发布时间字段
datetime.datetime(2017, 6, 9, 2, 59, 43, 68178, tzinfo=<UTC>)
>>>
>>> q.question_text="What's up?" # 修改q对象的question_text属性值
>>> q.save()# 保存
>>>
>>> Question.objects.all() #查看所有的问题对象列表
<QuerySet [<Question: Question object>]>
>>>

未完待续:5.3. 后台管理系统


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

mac 下卸载mysql的方法

今天在mac上瞎折腾时,把mysql玩坏了,想卸载重装,却发现找不到卸载程序,百度了下,将操作步骤备份于此: cd ~/ sudo rm /usr/local...

2707
来自专栏乐沙弥的世界

Buffer cache 的调整与优化(一)

Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能。当Buffer Cache过小的时候,将会造成更多的

1093
来自专栏杨建荣的学习笔记

MySQL中insert语句没有响应的问题分析(r11笔记第21天)

今天开发的一个同学问我一个MySQL的问题,说在测试数据库中执行一条Insert语句之后很久没有响应。我一看语句是一个很常规的insert into xxx ...

36612
来自专栏维C果糖

史上最简单的 MySQL 教程(三十五)「数据备份与还原(上)」

数据备份与还原的方式有很多种,具体可以分为:数据表备份、单表数据备份、SQL备份和增量备份。

4257
来自专栏PHP在线

总结

1.安装完成后备份快照 2.不插网线使用虚拟机,查看vmware的IP网段,设置linux系统相同的网段。 3.rpm -qa 软件名字 //查询软件是...

3225
来自专栏CSDN技术头条

MongoDB开发版本3.1.8发布

MongoDB 3.1.8版本已发布。值得注意的是此次3.1.8作为开发版本,并不适用于生产环境中使用。接来下的3.2系列版本将供广大用户作为生产环境中使用,敬...

2246
来自专栏杨建荣的学习笔记

关于修改分区表的准备和操作细则(r3笔记26天)

在之前的博文中,讨论过一个根据分区键值发现性能问题的案例。90%以上的数据都分布在了一个分区上,其它的分区要么没有数据要么数据很少,这是很明显的分区问题。当然这...

3056
来自专栏重庆的技术分享区

如何在Debian 8上安装MySQL

MySQL是一种流行的数据库管理系统,用于Web和服务器应用程序。本指南将介绍如何在运行Debian 8(Jessie)的Linode上安装,配置和管理MySQ...

7902
来自专栏java系列博客

pl/sql导入excel到oracle表

2227
来自专栏magicsoar

C++操作mysql方法总结(2)

C++通过ODBC和通过MFC ODBC操作mysql的两种方式 使用vs2013和64位的msql 5.6.16进行操作 ? 项目中使用的数据库名和表数据请参...

2666

扫码关注云+社区

领取腾讯云代金券