Python 12:mysql

Posted 水无

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 12:mysql相关的知识,希望对你有一定的参考价值。

Python 12:mysql


1、数据库基础

2、数据库基本操作

3、表操作

4、表内容操作

5、视图

6、事务

7、索引

8、pyMySQL

9、sqlalchemy ORM


一、数据库基础

1、关系型数据库

小型关系型数据库软件:MySql、SqlServer/Access、maridb(从原Mysql出来的人马组建的)

大型关系型数据库:Oracle、DB2/Infomix

非关系型数据库,比如云计算大数据所用的mongoDB

目前金融行业oracle占65%-70%,DB2占10%,informix占10%,光大银行180套系统全都是用的oracle,中银用的ORA+DB2,建行用的informix

2、术语

数据库: 数据库是一些关联表的集合。.

数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。

列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。

行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。

冗余:存储两倍数据,冗余可以使系统速度更快。

主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。

外键:外键用于关联两个表。

复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。

索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。

参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

二、数据库基本操作(mysql)

1、启动mysql

启动mysql服务:service mysqld start

查看监听状态:ss -tanl |grep :3306

账号登陆:mysql -u root -p 123456

2、显示数据库

show databases; 列出数据库管理系统的数据库列表。

默认数据库:
  mysql - 用户权限相关数据
  test - 用于用户测试数据
  information_schema - MySQL本身架构相关数据

3、创建数据库

create database 数据库名称 charset "utf8";  创建一个数据库,且让其支持中文编码格式(utf8)

4、使用数据库

use mysql; 选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。

desc user;  显示表结构

5、显示当前使用的数据库中的信息

show tables; 显示指定数据库的所有表,使用该命令前需要使用 use命令来选择要操作的数据库。

show columns from 数据表; 显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。

show index from 数据表; 显示数据表的详细索引信息,包括PRIMARY KEY(主键)。

6、删除数据库

drop database testdb; #删除数据库

7、用户管理

创建用户:create user ‘用户名‘@‘IP地址‘ identified by ‘密码‘;

删除用户:drop user ‘用户名‘@‘IP地址‘;

修改用户:rename user ‘用户名‘@‘IP地址‘; to ‘新用户名‘@‘IP地址‘;

修改密码:set password for ‘用户名‘@‘IP地址‘ = Password(‘新密码‘);

用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)

8、权限管理

show grants for ‘用户‘@‘IP地址‘                  -- 查看权限

grant 权限 on 数据库.表 to ‘用户‘@‘IP地址‘      -- 授权

revoke 权限 on 数据库.表 from ‘用户‘@‘IP地址‘      -- 取消权限

技术分享图片
 1 #权限
 2 ‘‘‘
 3 all privileges  除grant外的所有权限
 4         select          仅查权限
 5         select,insert   查和插入权限
 6         ...
 7         usage                   无访问权限
 8         alter                   使用alter table
 9         alter routine           使用alter procedure和drop procedure
10         create                  使用create table
11         create routine          使用create procedure
12         create temporary tables 使用create temporary tables
13         create user             使用create user、drop user、rename user和revoke  all privileges
14         create view             使用create view
15         delete                  使用delete
16         drop                    使用drop table
17         execute                 使用call和存储过程
18         file                    使用select into outfile 和 load data infile
19         grant option            使用grant 和 revoke
20         index                   使用index
21         insert                  使用insert
22         lock tables             使用lock table
23         process                 使用show full processlist
24         select                  使用select
25         show databases          使用show databases
26         show view               使用show view
27         update                  使用update
28         reload                  使用flush
29         shutdown                使用mysqladmin shutdown(关闭MySQL)
30         super                   ????使用change master、kill、logs、purge、master和set global。还允许mysqladmin????????调试登陆
31         replication client      服务器位置的访问
32         replication slave       由复制从属使用
33 ‘‘‘
34 #目标数据库以及内部其他:
35 ‘‘‘
36         数据库名.*           数据库中的所有
37         数据库名.表          指定数据库中的某张表
38         数据库名.存储过程    指定数据库中的存储过程
39         *.*                 所有数据库
40 ‘‘‘
41 #用户和ip
42 ‘‘‘
43         用户名@IP地址        用户只能在改IP下才能访问
44         用户名@192.168.1.%   用户只能在改IP段下才能访问(通配符%表示任意)
45         用户名@%             用户可以再任意IP下访问(默认IP地址为%)
46 ‘‘‘
47 #示例
48 ‘‘‘
49 grant all privileges on zzdb.student to ‘用户名‘@‘IP‘
50 grant select on zzdb.* to ‘用户名‘@‘IP‘
51 grant select,insert on *.* to ‘用户名‘@‘IP‘
52 revoke select on zzdb.student from ‘用户名‘@‘IP‘
53 ‘‘‘
示例

flush privileges;  刷新用户系统权限

三、数据表基本操作(mysql)

1、创建表

create table 表名(
列名 类型 是否可以为空,
列名 类型 是否可以为空
)ENGINE=InnoDB DEFAULT CHARSET=utf8

例:

create table student(
  stu_id INT NOT NULL AUTO_INCREMENT,
  name CHAR(32) NOT NULL,
  age INT NOT NULL,
  register_date DATE,
  PRIMARY KEY ( stu_id ))
ENGINE=InnoDB
DEFAULT CHARSET=utf8;

技术分享图片
 1 #是否为空
 2 ‘‘‘
 3     not null    - 不可空
 4     null        - 可空
 5 ‘‘‘
 6 #默认值
 7 ‘‘‘
 8     创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
 9         create table tb1(
10             id int not null defalut 2,
11             num int not null
12         )
13 ‘‘‘
14 #自增
15 ‘‘‘
16 如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增列)
17     create table tb1(
18         id int not null auto_increment primary key,
19         num int null
20     )
21 22     create table tb1(
23         nid int not null auto_increment,
24         num int null,
25         index(nid)
26     )
27     注意:1、对于自增列,必须是索引(含主键)。
28          2、对于自增可以设置步长和起始值
29              show session variables like ‘auto_inc%‘;
30              set session auto_increment_increment=2;
31              set session auto_increment_offset=10;
32 
33              shwo global  variables like ‘auto_inc%‘;
34              set global auto_increment_increment=2;
35              set global auto_increment_offset=10;
36 ‘‘‘
37 #主键
38 ‘‘‘
39 主键,一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果是多列,则其组合必须唯一。
40     create table tb1(
41         nid int not null auto_increment primary key,
42         num int null
43     )
44 45     create table tb1(
46         nid int not null,
47         num int not null,
48         primary key(nid,num)
49     )
50 ‘‘‘
51 #外键
52 ‘‘‘
53 外键,一个特殊的索引,只能是指定内容
54     creat table color(
55         nid int not null primary key,
56         name char(16) not null
57     )
58 
59     create table fruit(
60         nid int not null primary key,
61         smt char(32) null ,
62         color_id int not null,
63         constraint fk_cc foreign key (color_id) references color(nid)
64     )
65 ‘‘‘
参数

2、删除表

drop table 表名

3、清空表

delete from 表名

truncate table 表名

4、修改表

添加列:alter table 表名 add 列名 类型
删除列:alter table 表名 drop column 列名
修改列:alter table 表名 modify column 列名 类型; -- 类型
alter table 表名 change 原列名 新列名 类型; -- 列名,类型
添加主键:alter table 表名 add primary key(列名);
删除主键:alter table 表名 drop primary key;
alter table 表名 modify 列名 int, drop primary key;
添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
删除外键:alter table 表名 drop foreign key 外键名称
修改默认值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
删除默认值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

5、基本数据类型

MySQL的数据类型大致分为:数值、时间和字符串

技术分享图片
 1 bit:
 2     二进制位(101001),m表示二进制位的长度(1-64),默认m=1
 3 tinyint:
 4     小整数,数据类型用于保存一些范围的整数数值范围:
 5     有符号:-128 ~ 127.
 6     无符号:0 ~ 255
 7     特别的: MySQL中无布尔值,使用tinyint(1)构造。
 8 int:
 9     整数,数据类型用于保存一些范围的整数数值范围:
10     有符号:-2147483648 ~ 2147483647
11     无符号:0 ~ 4294967295
12     特别的:整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select 时数据显示为: 00002
13 bigint:
14     大整数,数据类型用于保存一些范围的整数数值范围:
15     有符号: -9223372036854775808 ~ 9223372036854775807
16     无符号:0 ~  18446744073709551615
17 decimal:
18     准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
19     特别的:对于精确数值计算时需要用此类型
20            decaimal能够存储精确值的原因在于其内部按照字符串存储。
21 FLOAT:
22     单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
23     无符号:
24         -3.402823466E+38 to -1.175494351E-38,
25         1.175494351E-38 to 3.402823466E+38
26     有符号:
27         1.175494351E-38 to 3.402823466E+38
28     **** 数值越大,越不准确 ****
29 DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
30     双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。
31     无符号:
32         -1.7976931348623157E+308 to -2.2250738585072014E-308
33         2.2250738585072014E-308 to 1.7976931348623157E+308
34     有符号:
35         2.2250738585072014E-308 to 1.7976931348623157E+308
36     **** 数值越大,越不准确 ****
37 char (m)
38     char数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中m代表字符串的长度。
39     PS: 即使数据小于m长度,也会占用m长度
40 varchar(m)
41     varchars数据类型用于变长的字符串,可以包含最多达255个字符。其中m代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。
42     注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡
43 text
44     text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 ? 1)个字符。
45 mediumtext
46     A TEXT column with a maximum length of 16,777,215 (2**24 ? 1) characters.
47 longtext
48     A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 ? 1) characters.
49 enum
50     枚举类型,
51     An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
52     示例:
53         CREATE TABLE shirts (
54             name VARCHAR(40),
55             size ENUM(x-small, small, medium, large, x-large)
56         );
57         INSERT INTO shirts (name, size) VALUES (dress shirt,large), (t-shirt,medium),(polo shirt,small);
58 set
59     集合类型
60     A SET column can have a maximum of 64 distinct members.
61     示例:
62         CREATE TABLE myset (col SET(a, b, c, d));
63         INSERT INTO myset (col) VALUES (a,d), (d,a), (a,d,a), (a,d,d), (d,a,d);
64 DATE
65     YYYY-MM-DD(1000-01-01/9999-12-3166 TIME
67     HH:MM:SS(-838:59:59/838:59:5968 YEAR
69     YYYY(1901/215570 DATETIME
71     YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)
72 TIMESTAMP
73     YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
数据类型

 四、表内容操作

 1、增

insert into 表 (列名,列名...) values (值,值,值...)
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
insert into 表 (列名,列名...) select (列名,列名...) from 表

2、删

delete from 表
delete from 表 where id=1 and name=‘zz‘

3、改

update 表 set name = ‘zz‘ where id>1

4、查

select * from 表
select * from 表 where id > 1
select id,name,gender as gg from 表 where id > 1

5、其他

技术分享图片
 1 a、条件
 2   select * from 表 where id > 1 and name != alex and num = 12; 
 3   select * from 表 where id between 5 and 16; 
 4   select * from 表 where id in (11,22,33)
 5   select * from 表 where id not in (11,22,33)
 6   select * from 表 where id in (select nid from 表) 
 7 b、通配符
 8   select * from 表 where name like aa% - aa开头的所有(多个字符串)
 9   select * from 表 where name like aa_ - aa开头的所有(一个字符) 
10 c、限制
11   select * from 表 limit 5; - 前5行
12   select * from 表 limit 4,5; - 从第4行开始的5行
13   select * from 表 limit 5 offset 4 - 从第4行开始的5行 
14 d、排序
15   select * from 表 order by 列 asc - 根据 “列” 从小到大排列
16   select * from 表 order by 列 desc - 根据 “列” 从大到小排列
17   select * from 表 order by 列1 desc,列2 asc - 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序
18 e、分组
19   select num from 表 group by num
20   select num,nid from 表 group by num,nid
21   select num,nid from 表 where nid > 10 group by num,nid order nid desc
22   select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid 
23   select num from 表 group by num having max(id) > 10 
24   特别的:group by 必须在where之后,order by之前 
25 f、连表
26   无对应关系则不显示
27   select A.num, A.name, B.name
28   from A,B
29   Where A.nid = B.nid 
30   无对应关系则不显示
31   select A.num, A.name, B.name
32   from A inner join B
33   on A.nid = B.nid 
34   A表所有显示,如果B中无对应关系,则值为null
35   select A.num, A.name, B.name
36   from A left join B
37   on A.nid = B.nid 
38   B表所有显示,如果B中无对应关系,则值为null
39   select A.num, A.name, B.name
40   from A right join B
41   on A.nid = B.nid 
42 g、组合
43   组合,自动处理重合
44   select nickname
45   from A
46   union
47   select name
48   from B 
49   组合,不处理重合
50   select nickname
51   from A
52   union all
53   select name
54   from B
其他

五、视图

视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,并可以将其当作表来使用。

SELECT * FROM (SELECT id,NAME FROM tb1 WHERE id > 2) AS A WHERE A. NAME > ‘zz‘;  #临时表搜索

创建视图:CREATE VIEW v1 AS SELET nid,name FROM A WHERE id > 4

删除视图:DROP VIEW v1

修改视图:

ALTER VIEW v1 AS SELET A.nid,B.NAME FROM
A LEFT JOIN B ON A.id = B.nid
LEFT JOIN C ON A.id = C.nid
WHERE A.id > 2 AND C.nid < 5

使用视图:select * from v1

六、事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务

事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行

事务用来管理insert,update,delete语句

一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

1、事务的原子性:一组事务,要么成功;要么撤回。

2、稳定性 : 有非法数据(外键约束之类),事务撤回。

3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候把事务保存到日志里。

控制台操作:

mysql> begin; #开始一个事务
mysql> insert into a (a) values(555)
mysql>rollback; 回滚 , 这样数据是不会写入的
当然如果上面的数据没问题,就输入commit提交命令就行;

七、索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
缺点:过多的使用索引将会造成滥用,虽然索引大大提高了查询速度,同时却会降低更新表的速度,
因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件,建立索引会占用磁盘空间的索引文件。

MySQL中常见索引有:普通索引、唯一索引、主键索引、组合索引

1、普通索引:

普通索引仅有一个功能:加速查询

技术分享图片
创建表时加入索引:

create table in1(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text,
index ix_name (name)
)

创建索引:create index index_name on table_name(column_name)
删除索引:drop index_name on table_name;
查看索引:show index from table_name;
对于创建索引时如果是BLOB 和 TEXT 类型,必须指定length。
create index ix_extra on in1(extra(32));
操作

2、唯一索引

唯一索引有两个功能:加速查询 和 唯一约束(可含null)

技术分享图片
创建表+唯一索引
create table in1(
    nid int not null auto_increment primary key,
    name varchar(32) not null,
    email varchar(64) not null,
    extra text,
    unique ix_name (name)
)
创建:create unique index 索引名 on 表名(列名)
删除:drop unique index 索引名 on 表名
操作

3、主键索引

主键有两个功能:加速查询 和 唯一约束(不可含null)

技术分享图片
 1 创建表+创建主键
 2 create table in1(
 3     nid int not null auto_increment primary key,
 4     name varchar(32) not null,
 5     email varchar(64) not null,
 6     extra text,
 7     index ix_name (name)
 8 )
 9 OR
10 create table in1(
11     nid int not null auto_increment,
12     name varchar(32) not null,
13     email varchar(64) not null,
14     extra text,
15     primary key(ni1),
16     index ix_name (name)
17 )
18 创建:alter table 表名 add primary key(列名);
19 删除:alter table 表名 drop primary key;
20       alter table 表名  modify  列名 int, drop primary key;
操作

4、组合索引

组合索引是将n个列组合成一个索引

技术分享图片
create table in3(
    nid int not null auto_increment primary key,
    name varchar(32) not null,
    email varchar(64) not null,
    extra text
)
创建组合索引:create index ix_name_email on in3(name,email);
注意:对于同时搜索n个条件时,组合索引的性能好于多个单一索引合并。
操作

5、显示索引信息

SHOW INDEX FROM table_nameG;

八、pyMySQL

pymysql基本操作

(使用原生sql语句)

技术分享图片
 1 import pymysql
 2 # 创建连接
 3 conn = pymysql.connect(host=192.168.43.165, port=3306, user=root, passwd=123456, db=zzdb)
 4 # 创建游标
 5 cursor = conn.cursor()
 6 #查询
 7 # effect_row = cursor.execute("select * from student")
 8 # #输出查询结果
 9 # print(cursor.fetchone())
10 # print(cursor.fetchall())
11 # 执行SQL,单行插入
12 effect_row = cursor.execute("insert into student(name,age,register_date) values(‘z1‘,33,‘2017-2-3‘)")
13 # 执行SQL,多行插入
14 # data = [
15 #     ("a1",13,"2018-2-3"),
16 #     ("a2",31,"2018-3-3"),
17 #     ("a3",41,"2018-4-3"),
18 # ]
19 # cursor.executemany("insert into student(name,age,register_date) value(%s,%s,%s)",data)
20 # 提交,不然无法保存新建或者修改的数据
21 conn.commit()
22 # 关闭游标
23 cursor.close()
24 # 关闭连接
25 conn.close()
pymysql

九、sqlalchemy ORM

1、orm介绍

object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。

优点:

a、隐藏了数据访问细节,“封闭”的通用数据库交互,使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。

b、ORM使我们构造固化数据结构变得简单易行。

缺点:

无可避免的,自动化意味着映射和关联管理,代价是牺牲性能。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。

2、sqlalchemy基本使用 

技术分享图片
  1 import sqlalchemy
  2 from sqlalchemy import create_engine
  3 from sqlalchemy.ext.declarative import declarative_base
  4 from sqlalchemy import Column, Integer, String,UniqueConstraint,Index
  5 from sqlalchemy.orm import sessionmaker
  6 
  7 engine = create_engine("mysql+pymysql://root:[email protected]/zzdb",
  8                                     encoding=utf-8)
  9 Base = declarative_base() #生成orm基类
 10 #创建表单
 11 class User(Base):
 12     __tablename__ = user #表名
 13     id = Column(Integer, primary_key=True)
 14     name = Column(String(32))
 15     password = Column(String(64))
 16 
 17     __table_args__ = (   #表配置
 18         UniqueConstraint(id, name, name=uix_id_name),  #唯一约束
 19         Index(ix_id_name, name, password),   #创建组合索引
 20     )
 21     def __repr__(self):
 22         return "<%s name:%s>"%(self.id,self.name)     #添加这个函数后可以清楚的现实返回的内容
 23 
 24 Base.metadata.create_all(engine) #创建表结构
 25 
 26 #插入数据
 27 Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
 28 Session = Session_class() #生成session实例,类似cursor
 29 
 30 user_obj = User(name="jj",password="000000") #生成你要创建的数据对象
 31 user_obj2 = User(name="aa",password="111111")
 32 print(user_obj.name,user_obj.id)  #此时还没创建对象呢,不信你打印一下id发现还是None
 33 
 34 Session.add(user_obj) #把要创建的数据对象添加到这个session里, 一会统一创建
 35 Session.add(user_obj2)
 36 print(user_obj.name,user_obj.id) #此时也依然还没创建
 37 
 38 Session.commit() #现此才统一提交,创建数据
 39 
 40 #删除
 41 Session.query(User).filter(User.id > 2).delete()
 42 Session.commit()
 43 
 44 #修改
 45 data = Session.query(User).filter(User.id > 1).filter(User.id < 4).first()
 46 print(data)
 47 data.name = "zab"
 48 data.password = "444444"
 49 
 50 Session.query(User).filter(User.id > 2).update({"name" : "099"})
 51 Session.query(User).filter(User.id > 2).update({User.name: User.name + "099"}, synchronize_session=False)
 52 Session.query(User).filter(User.id > 2).update({"num": User.num + 1}, synchronize_session="evaluate")
 53 Session.commit()
 54 
 55 #查询
 56 data = Session.query(User).filter_by(name = "zz").all()  #查询指定
 57 data = Session.query(User).filter(id > 2).all()  #指定判断类条件
 58 
 59 data = Session.query(User).filter_by().all()    #查询所有
 60 print(data)
 61 print(data[0].name,data[0].password)
 62 
 63 #多条件查询
 64 data = Session.query(User).filter(User.id > 1).filter(User.id < 4).all()
 65 print(data)
 66 
 67 #其他查询
 68 ‘‘‘
 69 # 条件
 70 ret = Session.query(User).filter_by(name=‘zz‘).all()
 71 ret = Session.query(User).filter(User.id > 1, User.name == ‘aa‘).all()
 72 ret = Session.query(User).filter(User.id.between(1, 3), User.name == ‘aa‘).all()
 73 ret = Session.query(User).filter(User.id.in_([1,3,4])).all()
 74 ret = Session.query(User).filter(~User.id.in_([1,3,4])).all()
 75 ret = Session.query(User).filter(User.id.in_(Session.query(User.id).filter_by(name=‘zz‘))).all()
 76 from sqlalchemy import and_, or_
 77 ret = Session.query(User).filter(and_(User.id > 3, User.name == ‘aa‘)).all()
 78 ret = Session.query(User).filter(or_(User.id < 2, User.name == ‘aa‘)).all()
 79 ret = Session.query(User).filter(
 80     or_(
 81         User.id < 2,
 82         and_(User.name == ‘eric‘, User.id > 3),
 83         User.extra != ""
 84     )).all()
 85 
 86 # 通配符
 87 ret = Session.query(User).filter(User.name.like(‘e%‘)).all()
 88 ret = Session.query(User).filter(~User.name.like(‘e%‘)).all()
 89 
 90 # 限制
 91 ret = Session.query(User)[1:2]
 92 
 93 # 排序
 94 ret = Session.query(User).order_by(User.name.desc()).all()
 95 ret = Session.query(User).order_by(User.name.desc(), User.id.asc()).all()
 96 
 97 # 分组
 98 from sqlalchemy.sql import func
 99 
100 ret = Session.query(User).group_by(User.extra).all()
101 ret = Session.query(
102     func.max(User.id),
103     func.sum(User.id),
104     func.min(User.id)).group_by(User.name).all()
105 
106 ret = Session.query(
107     func.max(User.id),
108     func.sum(User.id),
109     func.min(User.id)).group_by(User.name).having(func.min(User.id) >2).all()
110 
111 # 连表
112 ret = Session.query(User, Favor).filter(User.id == Favor.nid).all()
113 ret = Session.query(Person).join(Favor).all()
114 ret = Session.query(Person).join(Favor, isouter=True).all()
115 
116 # 组合
117 q1 = Session.query(User.name).filter(User.id > 2)
118 q2 = Session.query(Favor.caption).filter(Favor.nid < 2)
119 ret = q1.union(q2).all()
120 
121 q1 = Session.query(User.name).filter(User.id > 2)
122 q2 = Session.query(Favor.caption).filter(Favor.nid < 2)
123 ret = q1.union_all(q2).all()
124 ‘‘‘
125 
126 # 回滚
127 fake_user = User(name = bool,password = 123)
128 Session.add(fake_user)
129 print(Session.query(User).filter(User.name.in_([bool,])).all())
130 Session.rollback()
131 print(Session.query(User).filter(User.name.in_([bool,])).all())
132 
133 #统计
134 print(Session.query(User).filter(User.name.in_([aa,bb])).count())   #count()
135 
136 #分组统计
137 from sqlalchemy import func
138 print(Session.query(User.name,func.count(User.name)).group_by(User.name).all())
增删改查

3、外键关联

技术分享图片
 1 import sqlalchemy
 2 from sqlalchemy import create_engine
 3 from sqlalchemy.ext.declarative import declarative_base
 4 from sqlalchemy import Column, Integer, String,ForeignKey
 5 from sqlalchemy.orm import sessionmaker,relationship
 6 
 7 engine = create_engine("mysql+pymysql://root:[email protected]/zzdb",
 8                                     encoding=utf-8)
 9 Base = declarative_base() #生成orm基类
10 
11 class Student(Base):
12     __tablename__ = student #表名
13     id = Column(Integer, primary_key=True)
14     name = Column(String(32),nullable=False)
15     register_date = Column(String(32),nullable=False)
16 
17     def __repr__(self):
18         return "<%s name:%s>"%(self.id,self.name)
19 
20 class StudyRecord(Base):
21     __tablename__ = study_record #表名
22     id = Column(Integer, primary_key=True)
23     day = Column(Integer,nullable=False)
24     status  = Column(String(32),nullable=False)
25     stu_id = Column(Integer,ForeignKey("student.id"))
26 
27     student = relationship("Student", backref="my_study_record") #这个nb,允许你在user表里通过backref字段反向查出所有它在addresses表里的关联项
28     def __repr__(self):
29         return "<%s day:%s status:%s>"%(self.student.name,self.day,self.status)
30 
31 # Base.metadata.create_all(engine) #创建表结构
32 
33 Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
34 Session = Session_class() #生成session实例,类似cursor
35 #
36 # s1 = Student(name="zz",register_date = "2018-4-12")
37 # s2 = Student(name="aa",register_date = "2018-1-12")
38 # s3 = Student(name="bb",register_date = "2018-3-12")
39 # s4 = Student(name="cc",register_date = "2018-2-12")
40 #
41 # study_obj1 = StudyRecord(day = 1,status = "yes",stu_id = 1)
42 # study_obj2 = StudyRecord(day = 2,status = "yes",stu_id = 1)
43 # study_obj3 = StudyRecord(day = 3,status = "yes",stu_id = 1)
44 # study_obj4 = StudyRecord(day = 1,status = "yes",stu_id = 2)
45 #
46 # Session.add_all([s1,s2,s3,s4,study_obj1,study_obj2,study_obj3,study_obj4])
47 
48 stu_obj = Session.query(Student).filter(Student.name == "zz").first()
49 
50 print(stu_obj.my_study_record)
51 
52 Session.commit()
外键关联 

4、多外键关联

技术分享图片
 1 from sqlalchemy import Integer, ForeignKey, String, Column
 2 from sqlalchemy.ext.declarative import declarative_base
 3 from sqlalchemy.orm import relationship
 4 from sqlalchemy import create_engine
 5 
 6 engine = create_engine("mysql+pymysql://root:[email protected]/zzdb",
 7                                     encoding=utf-8)
 8 
 9 Base = declarative_base()
10 
11 class Customer(Base):
12     __tablename__ = customer
13     id = Column(Integer, primary_key=True)
14     name = Column(String(64))
15 
16     billing_address_id = Column(Integer, ForeignKey("address.id"))
17     shipping_address_id = Column(Integer, ForeignKey("address.id"))
18 
19     billing_address = relationship("Address", foreign_keys=[billing_address_id])
20     shipping_address = relationship("Address",foreign_keys=[shipping_address_id])
21 
22 class Address(Base):
23     __tablename__ = address
24     id = Column(Integer, primary_key=True)
25     street = Column(String(64))
26     city = Column(String(64))
27     state = Column(String(64))
28     def __repr__(self):
29         return self.street
30 
31 
32 # Base.metadata.create_all(engine) #创建表结构
一对多(表结构)
技术分享图片
 1 from zz_rpc import  orm_fk
 2 from sqlalchemy.orm import sessionmaker
 3 
 4 Session_class = sessionmaker(bind=orm_fk.engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
 5 Session = Session_class() #生成session实例,类似cursor
 6 
 7 # addr1 = orm_fk.Address(street = "Tiantongyuan",city = "ChagnPing",state = "beijing")
 8 # addr2 = orm_fk.Address(street = "Wudaokou",city = "Haidian",state = "beijing")
 9 # addr3 = orm_fk.Address(street = "Yanjiao",city = "Langfang",state = "beijing")
10 #
11 # Session.add_all([addr1,addr2,addr3])
12 # c1 = orm_fk.Customer(name = "zz",billing_address = addr1,shipping_address = addr2)
13 # c2 = orm_fk.Customer(name = "aa",billing_address = addr3,shipping_address = addr3)
14 #
15 # Session.add_all([c1,c2])
16 obj = Session.query(orm_fk.Customer).filter(orm_fk.Customer.name == "zz").first()
17 print(obj.name,obj.billing_address,obj.shipping_address)
18 Session.commit()
一对多(添加查询)

例:多对多

现在来设计一个能描述“图书”与“作者”的关系的表结构,需求是:

一本书可以有好几个作者一起出版;一个作者可以写好几本书

技术分享图片
 1 #一本书可以有多个作者,一个作者又可以出版多本书
 2 from sqlalchemy import Table, Column, Integer,String,DATE,ForeignKey
 3 from sqlalchemy.orm import relationship
 4 from sqlalchemy.ext.declarative import declarative_base
 5 from sqlalchemy import create_engine
 6 from sqlalchemy.orm import sessionmaker
 7 Base = declarative_base()
 8 book_m2m_author = Table(book_m2m_author, Base.metadata,
 9                         Column(book_id,Integer,ForeignKey(books.id)),
10                         Column(author_id,Integer,ForeignKey(authors.id)))
11 class Book(Base):
12     __tablename__ = books
13     id = Column(Integer,primary_key=True)
14     name = Column(String(64))
15     pub_date = Column(DATE)
16     authors = relationship(Author,secondary=book_m2m_author,backref=books)
17     def __repr__(self):
18         return self.name
19 class Author(Base):
20     __tablename__ = authors
21     id = Column(Integer, primary_key=True)
22     name = Column(String(32))
23     def __repr__(self):
24         return self.name
25 # engine = create_engine("mysql+pymysql://root:[email protected]/zzdb",
26 #                                     encoding=‘utf-8‘)   #插入中文
27 #sqlalchemy设置编码字符集一定要在数据库访问的URL上增加charset=utf8,否则数据库的连接就不是utf8的编码格式(如果上面那个不行就用下面这个)
28 engine = create_engine("mysql+pymysql://root:[email protected]/zzdb?charset=utf8")
29 Base.metadata.create_all(engine) #创建表结构
创建表结构
技术分享图片
from mysql_study import m2m
from sqlalchemy.orm import sessionmaker

Session_class = sessionmaker(bind=m2m.engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
session = Session_class() #生成session实例,类似cursor
b1 = m2m.Book(name = "learn python",pub_date = "2018-01-04")
b2 = m2m.Book(name = "learn linux",pub_date = "2018-04-12")
b3 = m2m.Book(name = "learn oracle",pub_date = "2018-05-08")
b4 = m2m.Book(name = "学中文",pub_date = "2018-05-08")
a1 = m2m.Author(name = "zz")
a2 = m2m.Author(name = "jj")
a3 = m2m.Author(name = "yy")
b1.authors = [a1,a3]
b2.authors = [a2,a3]
b3.authors = [a1,a2,a3]
session.add_all([b1,b2,b3,a1,a2,a3])
session.add_all([b4,])

author_obj = session.query(m2m.Author).filter(m2m.Author.name == "zz").first()
print(author_obj.books)
print(author_obj.books[1].pub_date)
book_obj = session.query(m2m.Book).filter(m2m.Book.id == 3).first()
print(book_obj.authors)
session.commit()
创建内容查询

多对多删除

删除数据时不用管book_m2m_authors,sqlalchemy会自动帮你把对应的数据删除

通过书删除作者时只会把这本书对应的该作者删除,而删除作者时,会把这个作者跟所有书的关联关系数据也自动删除

 






































以上是关于Python 12:mysql的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段12——JavaScript的Promise对象

部分代码片段

常用python日期日志获取内容循环的代码片段

linux中怎么查看mysql数据库版本

python 有用的Python代码片段

Python 向 Postman 请求代码片段