[Day 13] 第一主餐 pt.6-叮咚,有您的包裹

上一篇我们把MySQL安装设定好,并且开始跟django做互动了
今天我们就要来把MySQL的东东全部设定好,并且使用django自动生成Table
废话不多说,咱们累狗~

若无DB,何来Table

在上一篇我们可以看到,当我们要makemigrations时
MySQL告诉我们他找不到data这个Database
想当然尔,解决方法只要建立个Database就完事了
不过居然要自己手动新增Database,不如就给它取个好名字吧
一样输入mysql -u root -p登入
登入完之後,输入CREATE DATABASE "你要的DB名称";就可以建立一个Database啦
这里我们把DB取名叫stonks_db,所以就下CREATE DATABASE stonks_db;
啊对顺便说一下,MySQL的参数是不分大小写的,这点要注意一下
建立完後exit,记得settings.py内的DATABASE NAME栏位也要改成stonks_db
全部处理完後再次输入python3 manage.py makemigrations

OK这次就没跳错啦
但是在进入下一步之前,我们还有一个工作要处理
我们先再回去一趟MySQL
输入show variables like '%character%';

可以看到这里有些编码是用latin1,简单来说就是只支援欧美语系的字元啦
如果要支援中文字的话,就要改成utf8
所以我们要来去修改MySQL的设定档,把编码改成utf8
先离开MySQL terminal,然後输入sudo vi /etc/mysql/my.cnf

输入之後应该会看到这个画面
没错,咱们要来教你基础的linux terminal IO啦
首先先在这个画面按下i,你最底下那一行应该会变成-- INSERT --
这就代表你目前在文件编辑状态
我们把那个闪烁的字元位置提示拖到文章最末尾,然後按下ENTER,输入下列文字

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8

简单来说就是把mysql的用户端伺服端那些编码都设成utf8,这样之後存中文时才不会爆炸
输入完之後按下ESC离开编辑模式,此时你的terminal应该要变成下面这样

接着输入:wq!
这一段代表储存然後离开,并且不管权限问题,直接执行
执行完之後应该又会回来到command这边了
我们输入sudo service mysql restart重新启动mysql
再次进入MySQL输入show variables like '%character%';

看到database跟server栏位全部变成utf8就代表成功啦~

忍术Django操作资料库术

前面提到了,Django最厉害的地方就是前後端跟Database一起整合
居然我们MySQL跟Django沟通都弄好了,那就来测试一下吧
不过测试之前,我们还有一个步骤要做
我们先打开settings.py,然後把刚刚建立的app加入INSTALLED_APPS里面
此时你的INSTALLED_APPS list应该长这样

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'stonks_index'
]

好的,处理完之後我们就可以把我们的migrations送上去啦
啊对我们上一篇我们还没解释为什麽要加app
简单来说这东西就是Django的其他部门
这个部门里面当然会有分工,包含客服人员,货管人员,资讯人员等
只要总部(也就是我们设定的stonks_root)发现某个东西需要某个部门处理
django就会去找那个部门,然後部门就会开始照着url内的动作做事
那我们在这个部门建立model的用意就是,让这个部门可以使用Database仓库内的空间
建立并且管理所需资料
这就是我们开这个app的用意
好啦讲解完了,那我们就继续吧
先输入python3 manage.py makemigrations纪录models的修改
再输入python3 manage.py migrate就可以把你在django内的资料库变更送上去了
此时django就会自动跟MySQL要求给出空间,然後自动分配好空间内该有甚麽东西
就像下面这样

有没有体会到Django的强大之处了

建立完之後,我们就来测试一下一切是否安好
输入python3 manage.py shell进入Django的terminal
然後输入from stonks_index.models import DBTest
这里的意思就是从stonks_index内的models档案输入DBTest这个Class
如果没啥问题,应该会像下面这样

没有输出就是最好的输出

接着我们就可以来测试新增资料啦
输入test_db = DBTest()
这个语句代表新增一个DBTest的object,然後里面应该会有一个属性叫做test
用白话文来说就是
你今天路过X联看到了里面有卖一个火锅底料,於是你就跑进去全X里面买了一个
这个火锅底料基本上长相应该都是一模一样的,就是那一包会咸会辣液体
第二个顾客、第三个顾客、第2147483647个顾客去买这包火锅底料一定都是一样的
可是每个顾客回家里时对这包火锅底料的处理都不同
有的会放牛肉,有的放猪肉,有的放生菜,有的放火锅饺,有的甚至把底料当汤来喝
这时火锅的内容就代表着属性,每个属性可能都有自己的定义
但是class,也就是火锅底料,基本上都是长的一样的
当然也有黑魔法可以让你的火锅底料从麻辣锅变成寿喜烧甚至变成铁板烧,不过那不在我们讨论范围
以後有机会的话会再专门写一篇文章跟大家讲解

好的讲解完之後,就可以知道DBTest()就是一个容器
那我们就把里面的属性修改一下吧,这时输入
test_db.test = "I love Amane Kanata"
这时你的test属性就变成了I love Amane Kanata这个字串
就像你在火锅里加入芋头
啊不对这好像有点破坏性,改个例子好了
就像你在火锅里面加入猪肉片
里面的东东改变了,但它还是火锅
好的改完之後我们输入test_db.save()

无事发生,非常好

输入完之後我们回到MySQL看一下
进去MySQL之後输入use stonks_db;
然後我们输入SHOW TABLES;

可以看到我们有个table叫做stonks_index_dbtest
这就是django帮我们自动建立的table
然後我们再输入SELECT * FROM stonks_index_dbtest;

就可以看到我们刚刚建立的资料栏位跟内容出现在table内啦

好的,以上就是我们Django建立table以及跟MySQL的互动过程
下一步我们将会教学如何写一支API
以及API要怎麽自动把资料加入到Database
欲知人块讲接口API,爱安怎运作
且待下回分解~


<<:  OpenTelemetry 与 Jaeger 应用

>>:  [想试试看JavaScript ] 阵列一些操作阵列好用的方法 (二)

undefined 、 undeclared 、 null 的区别

这几天忙着北上,今天分享比较简单的内容,关於「undefined 、 undeclared 、 nu...

IT 铁人赛 k8s 入门30天 -- day12 Persisting Data in K8s with Volumes

前言 这篇文章主要介绍在 k8s 如何建立能够保存资料的服务 当我们需要让运行的服务资料状态能够在服...

第8天~

上偏加入字串空的 String all =""; 这里多了餐选的,饮料选的,全部...

Day 13 文字人脸效果

文字人脸效果 教学原文参考:文字人脸效果 这篇文章会介绍使用 GIMP 的图层混合功能,搭配文字输入...

以为Heroku push成功? 来个回马枪 zeitwerk/~~/callbacks.rb:17:in `on_file_autoloaded' , Zeitwerk::NameError

标题很丑,只希望当有遇到相同问题时,能找到这篇解决问题~~ 大家好,我是Sean,既上偏Heroku...