MySQL入帮派笔记(一)

MySQL入帮派笔记(二)

筹一个层次显明的目录结构,就是为着达到这一点儿触及:

一样、数据类型

  1. 可读性强:不熟知项目之丁,一眼便会看了然目录结构。
  2. 可维护性高:随着日之推移,代码/配置的范畴扩充,项目结构不碰面混杂,依旧能社团卓越。

1. 整型

起名 1

目社团办法:

2. 浮点型

起名 2

ATM
├── bin
│   └── start.py
├── conf
│   └── settings.py
├── core
│   └── test_main.py
├── db
│   └── db.json
├── docs
├── lib
│   └── common.py
├── log
│   └── access.log
└── README

3. 字符型

起名 3

简单的说解释一下:

4. 日未时间型

起名 4

  1. bin :存放项目之有些可执行文件,当然你可由名script/之类的也行。
  2. conf :配置文件目录
  3. core:核心代码目录
  4. db:数据目录
  5. docs :存放有注脚文档。
  6. lib:库文件,存放有起定义模块和保证
  7. log:日志目录
  8. README 安装表明

次、数据库操作

关于README的内容:

1. 创建库

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name;

  上述代码中DATABASE和SCHEMA完全相同,可任选一个(花括号内之参数为无选其同);

  添加IF NOT
EXISTS的打算则是,若新建数据库的称呼及已出数据库名称争辨,则生一个警示,若无拖欠重大字,则会生出错误(中括号内之参数为可略参数);

  db_name为数据库名称;

  [DEFAULT] CHARACTER SET [=]
为指定数据库的字符编码,可免点名要以默认的字符编码。

  例1:成立一个名叫也test的数据库

CREATE DATABASE test;

  例2:创制一个叫做也test2的数据库并指定字符编码为GBK

CREATE DATABASE test2 CHARACTER SET gbk;

  有一些消小心的是,这等同手续仅仅是创办了数据库,在背后要创造数量表时,需要打开指定数据库:

USE db_name;

README的意是描述该品种的新闻,让读者很快了然是类型。
它们用注脚以下多少个事项:

2. 删除库

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;

  参数与创立数据库基本一致。

  1. 起名,软件定位,软件之基本效能。
  2. 运行代码的措施:安装环境、启动命令等。
  3. 简单的运用表达。
  4. 代码目录结构表达,更详细点可以证实软件的基本原理。
  5. 大面积问题求证。

3. 修改库

ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] charset_name;

  可改的无非为字符编码情势。若不指定数据库名称,则改时入选的数据库。例:将称为也test的数据库的字符编码模式改吧utf-8

ALTER DATABASE test CHARACTER SET utf8;

关于requirements.txt和setup.py

4. 查看库

起名 5起名 6

4.1 查看时所有库

SHOW DATABASES;
一般来说,用setup.py来管理代码的打包、安装、部署问题。业界标准的写法是用Python流行的打包工具setuptools来管理这些事情。这种方式普遍应用于开源项目中。不过这里的核心思想不是用标准化的工具来解决这些问题,而是说,一个项目一定要有一个安装部署工具,能快速便捷的在一台新机器上将环境装好、代码部署好和将程序运行起来。
这个我是踩过坑的。
我刚开始接触Python写项目的时候,安装环境、部署代码、运行程序这个过程全是手动完成,遇到过以下问题:
1、安装环境时经常忘了最近又添加了一个新的Python包,结果一到线上运行,程序就出错了。
2、Python包的版本依赖问题,有时候我们程序中使用的是一个版本的Python包,但是官方的已经是最新的包了,通过手动安装就可能装错了。
3、如果依赖的包很多的话,一个一个安装这些依赖是很费时的事情。
4、新同学开始写项目的时候,将程序跑起来非常麻烦,因为可能经常忘了要怎么安装各种依赖。
setup.py可以将这些事情自动化起来,提高效率、减少出错的概率。"复杂的东西自动化,能自动化的东西一定要自动化。"是一个非常好的习惯。
setuptools的文档比较庞大,刚接触的话,可能不太好找到切入点。学习技术的方式就是看他人是怎么用的,可以参考一下Python的一个Web框架,flask是如何写的: setup.py
当然,简单点自己写个安装脚本(deploy.sh)替代setup.py也未尝不可。

4.2 查看指定数据库的始建音信

SHOW CREATE DATABASE db_name;

setup.py说明

4.3 查看时打开的数据库

SELECT DATABASE();

起名 7起名 8

老三、数据表操作

这个文件存在的目的是:
1、方便开发者维护软件的包依赖。将开发过程中新增的包添加进这个列表中,避免在setup.py安装依赖时漏掉软件包。
2、方便读者明确项目使用了哪些Python包。
这个文件的格式是每一行包含一个包依赖的说明,通常是flask>=0.10这种格式,要求是这个格式能被pip识别,这样就可以简单的通过 pip install -r requirements.txt来把所有Python包依赖都装好了。

1. 成立表(各个束缚)

requirements.txt说明

1.1 定义

CREATE TABLE [IF NOT EXISTS] table_name(
    column_name data_type [constraint],
    ···
);

  constraint为约束,可挑选参数。(详情见1.2
约束)例:成立一个名为t1,包含id、username以及age六个字段的数据表

CREATE TABLE t1(
    id SMALLINT UNSIGNED,
    username VARCHAR(20),
    age TINYINT UNSIGNED
);

至于配置文件之采取方法:

1.2 约束

  约束,顾名思义,即针对少数列或整表来约束、限制,扩大输入规则,例如某些列不允为空、某些列不允许再等。按照职能区划,有以下几种植:

起名 9起名 10

(1)主键约束

PRIMARY KEY

  主键约束用于唯一地标识表中之各级一样久记下,通俗地游说,就是加了主键约束之排或者表,不同意有更的笔录。==添加了主键约束的排列自动吗NOT
NULL。==

  例:某表中在一列用来存储用户名,用主键约束限制其无可知是重复的用户称

username VARCHAR(20) PRIMARY KEY

  ==活动编号:==

AUTO_INCREMENT

  顾名思义,即自动编号,序号从1起始。需要小心,AUTO_INCREMENT必须跟主键约束配套下。

  例:

id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT
1、配置文件写在一个或多个python文件中,比如此处的conf.py。
2、项目中哪个模块用到这个配置文件就直接通过import conf这种形式来在代码中使用配置。
这种做法我不太赞同:
1、这让单元测试变得困难(因为模块内部依赖了外部配置)
2、另一方面配置文件作为用户控制程序的接口,应当可以由用户自由指定该文件的路径。
3、程序组件可复用性太差,因为这种贯穿所有模块的代码硬编码方式,使得大部分模块都依赖conf.py这个文件。
所以,我认为配置的使用,更好的方式是,
1、模块的配置都是可以灵活配置的,不受外部配置文件的影响。
2、程序的配置也是可以灵活控制的。
能够佐证这个思想的是,用过nginx和mysql的同学都知道,nginx、mysql这些程序都可以自由的指定用户配置。
所以,不应当在代码中直接import conf来使用配置文件。上面目录结构中的conf.py,是给出的一个配置样例,不是在写死在程序中直接引用的配置文件。可以通过给main.py启动参数指定配置路径的方式来让程序读取配置内容。当然,这里的conf.py你可以换个类似的名字,比如settings.py。或者你也可以使用其他格式的内容来编写配置文件,比如settings.yaml之类的。

(2)唯一约束

UNIQUE KEY

  唯一约束和主键约束效率一样,也用于标识记录之唯一性,不同之处在于,同一个数据表中唯独有多少个唯一约束,但主键约束只能存在一个。此外,主键约束不容许为空,唯一约束则允许有唯一的NULL值。

配备文件注解

(3)非空约束

NOT NULL

  非空约束之用来禁止用户以非空约束的排列被输入NULL。

 

(4)默认约束

DEFAULT value

  用于安装字段的默认值,当用户不输入当前配段时,将机关填写入默认值。

  例:定义一个sex字段,默认境况下也3

sex ENUM('1', '2', '3') DEFAULT 3

至于作业:

(5)外键约束

FOREIGN KEY(column_name1) REFERENCES table_name(column_name2)

  外键约束一般用来两唯有某种关联的字段,实现一对一或者同等针对性几近之涉嫌。

  例1:创设一个父表location和一个子表users,通过外键约束关联location中之id与users中之lid

CREATE TABLE location(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL
);

CREATE TABLE users(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20) NOT NULL,
    lid SMALLINT UNSIGNED,
    FOREIGN KEY(lid) REFERENCES location(id)
);

  使用外键约束需要留意有题材,第一,父表和子表禁止以临时表;第二,父表和子表必须运用同一之囤引擎,且必须为InnoDB;第三,外键列与参照列必须持有相似的数据类型,其中倘否==数字==(INT、FLOAT等),则该==类型长度及是否出记号位都不可能不完全相同==,若为==字符==,则只是为==不同长度==;第四,向子表插入记录时,需确保父表不也空。

外键约束的参照操作:

  指定当去或更新父表中之笔录时,对子表举办的操作。使用方法啊以外键约束末尾加上ON DELETE,然后加上相应操作的首要性字。操作分别发出以下三种:

  1)CASCADE:当去或更新父表中之笔录时,自动更新或删除子表中相应的笔录。

  2)SET NULL:当去或更新父表中的笔录时,将子表中相应的记录的外键列设置为NULL。==注意,需确保改外键列没有点名为NOT
NULL。==

  3)RESTRICT:当父表中之笔录被子表中的记录所参照时,那个受参照的笔录不允举办删除或更新操作,而非让参照的笔录则只是轻易删除或更新。

  例:

  父表:

id(参照列) name
1 A
2 B
3 C

  子表:

name aid(外键列)
a 1
b 1
c 2

  于面这种场馆中,若子表的外键约束加了RESTRICT要字,则由于父表中id为1暨2之星星点点条记下为参照,不可知给剔除或更新;而id为3的记录不让参照,因而得以去或更新。

  4)NO ACTION:标准SQL中的要字,在MySQL中同于RESTRICT。

学业必备知识:

2. 删除表

DROP TABLE tbl_name;
  1. 模块导入
  2. 目录社团结构
  3. 函数
  4. 老三着模块(体系化、logging)
  5. 装饰器
  6. 下面向过程开发(ATM程序是免常转移得程序)

3. 双重改表名称

软件开发流程:

3.1 更改单个数据表名称

ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name;
  1. 画流程图
  2. 写README
  3. 严加按照软件开发规范去开发顺序

3.2 更改多独数据表名称

RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ……

作业要求:

4. 查看表

宪章实现一个ATM + 购物超市先后

4.1 查看数据库内存在的表

SHOW TABLES [FROM db_name];
  1. 额度 15000或者从定义
  2. 贯彻购物商城,买东西在 购物车,调用信用卡接口结账
  3. 可以提现,手续费5%
  4. 每月22如泣如诉出账单,每月10号为还款日,过期未还,按欠款总额
    万区划的5 天天计息
  5. 辅助多账户登录
  6. 支撑账户里转账
  7. 记录每月一般消费流水
  8. 提供还款接口
  9. ATM记录操作日志 
  10. 供管理接口,包括丰硕账户、用户额度,冻结账户等。。。
  11. 用户征用装饰器

4.2 查看表的创办音讯(存储引擎、编码形式等)

SHOW CREATE TABLE table_name;

示范代码 https://github.com/triaquae/py3\_training/tree/master/atm 

4.3 查看表结构

SHOW COLUMNS FROM table_name;

简简单单流程图:https://www.processon.com/view/link/589eb841e4b0999184934329 

5. 列操作

 

5.1 添加列

参考链接:http://www.cnblogs.com/alex3714/articles/5765046.html

(1)添加单列

ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name2];

  关键字COLUMN可不加;FIRST的打算是以增添列置于指定表的突出前头,AFTER col_name2虽是将增列置于col_name2的下一列。

  例:存在一表test,含有id字段,现在id字段的下一列扩展一个name字段

ALTER TABLE test ADD name VARCHAR(20) NOT NULL AFTER id;

(2)添加多列

ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition, ……)

  添加多排时多单字段写进小括号内,以逗号相隔,添加多排与添加单排的不同之处在于添加多列不得以指定添加地点,而是默认添加到数据表的末尾。

5.2 删除列

ALTER TABLE tbl_name DROP [COLUMN] col_name;

  如要以删除多排列,则调用多次DROP。

  例:存在表test,含有password、sex字段,现与此同时删除这简单独字段

ALTER TABLE test DROP password, DROP sex;

5.3 修改列定义

(1)MODIFY

ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name];

  MODIFY可用于修改列定义及列地方。例:存在以下数据表t2,

+-------+----------------------+------+-----+---------+-------+
| Field | Type                 | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| id    | smallint(5) unsigned | NO   |     | NULL    |       |
| name  | varchar(20)          | YES  | MUL | NULL    |       |
| age   | tinyint(4)           | YES  | UNI | NULL    |       |
| sex   | enum('1','2','3')    | YES  |     | NULL    |       |
| aid   | smallint(5) unsigned | YES  | MUL | NULL    |       |
+-------+----------------------+------+-----+---------+-------+

  现将id字段移至name字段下一样排,操作为:

ALTER TABLE t2 MODIFY id SMALLINT UNSIGNED NOT NULL AFTER name;

  再用id字段的数据类型改呢INT,操作为:

ALTER TABLE t2 MODIFY id INT UNSIGNED NOT NULL;

  也得以以两步操作而举办:

ALTER TABLE t2 MODIFY id INT UNSIGNED NOT NULL AFTER name;

  (2)CHANGE

ALTER TABLE tbl_name CHANE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name];

  CHANGE以及MODIFY基本一致,不同之处在于CHANGE可修改列名称而MODIFY不得以。

5.4 添加约束

  考虑到入门级其它读者多不念索引,因而对约束之操作着涉嫌到目录的有些全部刨除,仅介绍最主题的用法,需要研商完整意义的读者可自行检索有关材料。

(1)主键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY (col_name)

  symbol也束缚之号或别名,自行定义。例:为表test中之id字段添加主键约束并于名叫吧PK_test_id

ALTER TABLE test ADD CONSTRAINT PK_test_id PRIMARY KEY (id);

(2)唯一约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE (col_name, ……);

  添加唯一约束之章程及主键约束基本一致,不同之处在于唯一约束而又添加五个,而主键约束只可以发出一个。

(3)默认约束

ALTER TABLE tbl_name ALTER [COLUMN] col_name SET DEFAULT literal;

  literal也默认值。例:为表test中的age字段设置默认值为18

ALTER TABLE test ALTER age SET DEFAULT 15;

(4)外键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (col_name) reference_definition;

  例:为表test中之aid字段添加外键约束,参照列为表test2中的id字段

ALTER TABLE test ADD FOREIGN KEY(aid) REFERENCES test2(id); 

5.5 删除约束

(1)主键约束

ALTER TABLE tbl_name DROP PRIMARY KEY;

(2)唯一约束

ALTER TABLE tbl_name DROP {INDEX | KEY} index_name;

  花括号内之INDEX和KEY任选这么些。注意,在此处要使用如去除的格所当字段的==索引==而无是字段名称,查看索引而利用命令SHOW INDEXES FROM tbl_name\G(\G是点名结果因网格情势出口,可免加以),输出结果丁的Key_name即为索引名称。

*************************** 1. row ***************************
    Table: t2
    Non_unique: 0
    Key_name: name
    Seq_in_index: 1
    Column_name: name
    Collation: A
    Cardinality: 0
    Sub_part: NULL
    Packed: NULL
    Null: YES
    Index_type: BTREE
    Comment:
    Index_comment:

  例如地点这同一字段的目录名称固然为name。

(3)默认约束

ALTER TABLE tbl_name ALTER [COLUMN] col_name DROP DEFAULT;
(4)外键约束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

  删除外键约束不待指定列,但必须输入外键的记号fk_symbol,查看外键标记可利用命令SHOW CREATE TABLE tbl_name,即查数据表的创建信息。

| t2    | CREATE TABLE `t2` (
  `id` smallint(5) unsigned NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` tinyint(4) DEFAULT NULL,
  `sex` enum('1','2','3'),
  `aid` smallint(5) unsigned DEFAULT NULL,
  UNIQUE KEY `name` (`name`,`age`),
  UNIQUE KEY `age` (`age`),
  UNIQUE KEY `age_2` (`age`),
  KEY `aid` (`aid`),
  CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`aid`) REFERENCES `t1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

  例如,下边这等同数码表t2遭逢,aid为他键列,因此找到呼应的外键标记,为t2_ibfk_1,所以去那同外键约束之操作为:

ALTER TABLE t2 DROP FOREIGN KEY t2_ibfk_1;

季、记录操作

1. 补给加记录

1.1 INSERT

INSERT [INTO] tbl_name [(col_name,···)] {VALUES | VALUE} ({expr | DEFAULT}, ...), (...), ...;

  添加记录但免因定列,这种意况下得逐一输入当前记下有字段的数码;若需就输入其中一些字段的值,则于表名后指定相应的列名称;{expr
|
DEFAULT}的意为,可以一贯输入相应的值,也足以输入表明式;其它,使用INSERT语句插入记录但同时插入多少长度长的记下。

  例:向一个名叫也test,含有id、username、age三独字段的表中插入一修记下:

INSERT test VALUES(DEFAULT, 'Kity', 16+2);

  若只是输入username、age:

INSERT test(username, age) VALUES('Kity', 18);

  若同时插入两长达记下:

INSERT test(username, age) VALUES('Kity', 18), ('Smith', 26);

1.2 INSERT-SET

INSERT [INTO] tbl_name SET col_name = {expr | DEFAULT}, ...;

  这种艺术跟第一种植办法的别在于,这种形式能用于子查询,同时这种方法每一遍只可以输入一修记下。

1.3 INSERT-SELECT

INSERT [INTO] tbl_name [(col_name, ...)] SELECT ...

  这种情势的意是以SELECT(若对SELECT的语法不知底,可先行看后的4.查询记录)的询问结果插入到指定数量表中(实际上采取了子查询,不精晓的读者可查阅MySQL入帮派笔记(二)),需要留意,查询的字段数量要与插入的字段数量相匹配,否则即会合出现错误。

  例:将表t1丁age大于30之笔录之name、age字段插入到表t2备受:

INSERT t2(username, age) SELECT name, age FROM t1 WHERE age > 30;

2. 去除记录

DELETE FROM tbl_name [WHERE where_condition]

  WHERE关键字也对革新记录的规则(相当于Java中的if),若无加,则去所有记下。

  例:删除表test中id为偶数的记录:

DELETE FROM test WHERE id % 2 = 0;

3. 革新记录(单表更新)

UPDATE [LOW_PRIORITY] [IGNORE] tbl_references SET col_name1 = {expr1 | DEFAULT} [, col_name2 = {expr2 | DEFAULT}] ... [WHERE where_condition];

  tbl_reference也表名称。例1:更新表t1挨之age字段,使该全方位充实5:

UPDATE t1 SET age = age + 5;

  例2:使表t2着的age字段全体吧0,sex字段(非枚举类型)全体取相反数:

UPDATE t2 SET age = 0, sex = -sex;

  例3:使表t3中id为2的一项name为John:

UPDATE t3 SET name = 'John' WHERE id = 2;

4. 查询记录

SELECT select_expr [, select_expr2 ...]
[
    FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | position} [ASC | DESC]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position} [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
];

4.1 SELECT select_expr [, select_expr2 …](最简单易行也不行常用的形式)

  例:查看数据库版本:

SELECT VERSION();

4.2 FROM table_references

  查询数据表中的指定列的记录。例:查询表test中之总体字段的笔录:

SELECT * FROM test;

  或仅查询其中的id、name字段==(顺序可依照需要自由调整)==:

SELECT id, name FROM test;

4.3 AS

  在查询表时,有时(例如单表模拟多表操作)会待呢字段赋予别名,这时便用AS。

  例:查询表test中的id、username字段,并被username赋予别名name:

SELECT id, username AS name FROM test;

4.4 GROUP BY {col_name | position} [ASC | DESC]

  GROUP
BY用于对查询结果举办排序。可以指定举办分组的列名称,也足以指定地点position,地方就是SELECT语句询问的询问顺序,例如SELECT id, username FROM test;,在此处要输入地点也2,则针对username字段进行分组;此外,还可指定分组是的排顺序,ASC为升序,DESC为降序。

  例:查询表test中之name、age字段,并因age字段分组由老及小排列:

SELECT name, age FROM test GROUP BY age DESC;

4.5 [HAVING where_condition]

  HAVING用于安装分组条件,即限制举办分组的笔录范围。==需要注意的是,若条件被之所以到表中的某些字段举办判断,那么所利用的字段必须是当查询列表中之。==

  例:查询表test中的name、age字段,并以age>30之记录举行分组:

SELECT name, age FROM test GROUP BY age HAVING age > 30;

4.6 ORDER BY {col_name | expr | position} [ASC | DESC], …

  ORDER
BY用于对查询结果举办排序。若添加个规范,则以率先尺码一致的动静下,比较第二规格,以此类推。

  例:查询表test中之享有字段,并仍age升序排列,若age相同,则随id降序排列:

SELECT * FROM test ORDER BY age, id DESC;

4.7 LIMIT {[offset,] row_count | row_count OFFSET offset}

  LIMIT用于限制再次来到的询问结果的数额。offset为查询的起源,要小心,同大部分言语一样,==MySQL中率先条记下也0==;row_count则为查询结果的数量。此外使用LIMIT语句子举行限定时,==其以的相继是查询结果的一一==,而不是数据表存储的逐条。

  例:查询表test中之持有字段,显示第3暨第5长长的记下:

SELECT * FROM test LIMIT 2, 3;

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图