python基础笔记--mysql

SQL语句主要分为:
DQL:数据查询语言,用于对数据进行查询,如select
DML:数据操作语言,对数据进行增加、修改、删除,如insert、udpate、delete
TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
DCL:数据控制语言,进行授权与权限回收,如grant、revoke
DDL:数据定义语言,进行数据库、表的管理等,如create、drop
CCL:指针控制语言,通过控制指针完成表的操作,如declare cursor

创建Connection连接

conn = connect(host=‘localhost’, port=3306, user=‘root’, password=‘mysql’, database=‘python1’, charset=‘utf8’)

得Cursor对象

cs = conn.cursor()

更新

sql = ‘update students set name=“刘邦” where id=6’

删除

sql = ‘delete from students where id=6’

执行select语句,并返回受影响的行数:查询一条学生数据

sql = ‘select id,name from students where id = 7’

sql = ‘SELECT id,name FROM students WHERE id = 7’

count=cs.execute(sql)

打印受影响的行数

print(count)

数据完整性
一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中
在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束
数据类型
可以通过查看帮助文档查阅所有支持的数据类型
使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间
常用数据类型如下:
整数:int,bit
小数:decimal
字符串:varchar,char
日期时间: date, time, datetime
枚举类型(enum)
特别说明的类型如下:
decimal表示浮点数,如decimal(5,2)表示共存5位数,小数占2位
char表示固定长度的字符串,如char(3),如果填充’ab’时会补一个空格为’ab ’
varchar表示可变长度的字符串,如varchar(3),填充’ab’时就会存储’ab’
字符串text表示存储大文本,当字符大于4000时推荐使用
对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径

约束
主键primary key:物理上存储的顺序
非空not null:此字段不允许填写空值
惟一unique:此字段的值不允许重复
默认default:当不填写此值时会使用默认值,如果填写时以填写为准
外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常
说明:虽然外键约束可以保证数据的有效性,但是在进行数据的crud(增加、修改、删除、查询)时,都会降低数据库的性能,所以不推荐使用,那么数据的有效性怎么保证呢?答:可以在逻辑层进行控制

数据库
查看所有数据库
show databases;
使用数据库
use 数据库名;
查看当前使用的数据库
select database();
创建数据库
create database 数据库名 charset=utf8;
例:
create database python charset=utf8;
删除数据库
drop database 数据库名;
例:
drop database python;

查看当前数据库中所有表
show tables;
查看表结构
desc 表名;

表的设计:
一对一;
一对多;
多对多;

多对多一般有第三张表 做关联

向表中插入数据:-- 向students表中插入数据
insert into students values
(0,‘小明’,18,180.00,2,1,0),
(0,‘小月月’,18,180.00,2,2,1),

查询所有字段
select * from 表名;
例:
select * from students;
查询指定字段
select 列1,列2,… from 表名;
例:
select name from students;
使用 as 给字段起别名
select id as 序号, name as 名字, gender as 性别 from students;
可以通过 as 给表起别名

select * from 表名 where 条件;
例:
select * from students where id=1;

比较运算符
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <>
例1:查询编号大于3的学生

select * from students where id > 3;
例2:查询编号不大于4的学生

select * from students where id <= 4;
例3:查询姓名不是“黄蓉”的学生

select * from students where name != ‘黄蓉’;
例4:查询没被删除的学生

select * from students where is_delete=0;

逻辑运算符
and
or
not
例5:查询编号大于3的女同学

select * from students where id > 3 and gender=0;
例6:查询编号小于4或没被删除的学生

select * from students where id < 4 or is_delete=0;
模糊查询
like
%表示任意多个任意字符
_表示一个任意字符
例7:查询姓黄的学生

select * from students where name like ‘黄%’;
例8:查询姓黄并且“名”是一个字的学生

select * from students where name like ‘黄_’;
例9:查询姓黄或叫靖的学生

select * from students where name like ‘黄%’ or name like ‘%靖’;
范围查询
in表示在一个非连续的范围内
例10:查询编号是1或3或8的学生

select * from students where id in(1,3,8);
between … and …表示在一个连续的范围内
例11:查询编号为3至8的学生

select * from students where id between 3 and 8;
例12:查询编号是3至8的男生

select * from students where (id between 3 and 8) and gender=1;
空判断
注意:null与’'是不同的
判空is null
例13:查询没有填写身高的学生

select * from students where height is null;
判非空is not null
例14:查询填写了身高的学生

select * from students where height is not null;
例15:查询填写了身高的男生

select * from students where height is not null and gender=1;
优先级
优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符
and比or先运算,如果同时出现并希望先算or,需要结合()使用

排序
为了方便查看数据,可以对数据进行排序

语法:
select * from 表名 order by 列1 asc|desc [,列2 asc|desc,…]

说明
将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
默认按照列值从小到大排列(asc)
asc从小到大排列,即升序
desc从大到小排序,即降序
例1:查询未删除男生信息,按学号降序

select * from students where gender=1 and is_delete=0 order by id desc;
例2:查询未删除学生信息,按名称升序

select * from students where is_delete=0 order by name;
例3:显示所有的学生信息,先按照年龄从大–>小排序,当年龄相同时 按照身高从高–>矮排序

select * from students order by age desc,height desc;

聚合函数
为了快速得到统计数据,经常会用到如下5个聚合函数

总数
count(*)表示计算总行数,括号中写星与列名,结果是相同的
例1:查询学生总数

select count(*) from students;
最大值
max(列)表示求此列的最大值
例2:查询女生的编号最大值

select max(id) from students where gender=2;
最小值
min(列)表示求此列的最小值
例3:查询未删除的学生最小编号

select min(id) from students where is_delete=0;
求和
sum(列)表示求此列的和
例4:查询男生的总年龄

select sum(age) from students where gender=1;

– 平均年龄
select sum(age)/count(*) from students where gender=1;
平均值
avg(列)表示求此列的平均值
例5:查询未删除女生的编号平均值

select avg(id) from students where is_delete=0 and gender=2;

获取部分行
当数据量过大时,在一页中查看数据是一件非常麻烦的事情

语法
select * from 表名 limit start,count
说明
从start开始,获取count条数据
例1:查询前3行男生信息

select * from students where gender=1 limit 0,3;
示例:分页
已知:每页显示m条数据,当前显示第n页
求总页数:此段逻辑后面会在python中实现
查询总条数p1
使用p1除以m得到p2
如果整除则p2为总数页
如果不整除则p2+1为总页数
求第n页的数据
select * from students where is_delete=0 limit (n-1)*m,m

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

事务四大特性(简称ACID)
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)

原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,
不可能只执行其中的一部分操作,这就是事务的原子性

一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,
支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)

隔离性(isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,
此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)

持久性(durability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)

开启事务,命令如下:
开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
begin;
或者
start transaction;
提交事务,命令如下
将缓存中的数据变更维护到物理表中
commit;
回滚事务,命令如下:
放弃缓存中变更的数据
rollback;

索引的使用
查看索引
show index from 表名;
创建索引
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分
create index 索引名称 on 表名(字段名称(长度))
删除索引:
drop index 索引名称 on 表名;

web静态服务器非堵塞:

单进程模式:

  1. 会将所有的新的链接的socket链接放在一个列表面形成队列;
  2. 将套接字设置为非堵塞
    server_socket.setblocking(False)
    设置为非堵塞之后;如果accept时恰巧没有客户端链接connect,那么
    accpet就会产生一个异常,所以使用try来进行处理;
    try:
    newClientInfo = server_socket.accept()
    except Exception as result:
    pass
    else:
    print(“一个新的客户端到来:%s” % str(newClientInfo))
    newClientInfo[0].setblocking(False) # 设置为非堵塞
    g_socket_list.append(newClientInfo)

web静态服务器epoll

IO输入与输出的多路复用; 基本的原理就是select,poll, epoll这个function会不断的轮询所负责的所有的socket
,当某个socket有数据到达的时候,就会通知进程。

创建一个epoll对象

epoll = select.epoll()

epoll的几个属性:
EPOLLN(可读)
EPOLLOUT(可写)
EPOLLET(ET模式)

对于epoll的小结; 简单说就是,为了提高服务器处理socket的链接的效率,会监视列表里面;当任何socket有可读可写的时候
立马处理;如果select/epoll手里同时检测着很多socket,一有动静就会马上返回给进程处理,就会比
一个一个socket过来,阻塞等待处理的效率要高。

私有化:

xx: 公有变量
_x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
_xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字
xx
:单后置下划线,用于避免与Python关键词的冲突

父类中属性名为__名字的,子类不继承,子类不能访问
如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性
_名的变量、函数、类在使用from xxx import *时都不会被导入

面向对象的三大特性;
封装,继承,多态;

为什么要封装:
实际开发中会出现,并发程序对同一个全局变量操作的问题;

所以我们将变量+函数制作成一个模板,这样每个人需要这个函数的功能和
这个变量的数据的时候就自己去拿,拿到的都是初始值。

继承:
为什么要继承:

有时候为了对一个类的方法进行扩充;为了不再去从新写一份代码,就可以通过继承,对父类方法进行重写。
省去了很多不必要的麻烦;
能够提升代码的重用率,即开发一个类,可以在多个子功能中直接使用
继承能够有效的进行代码的管理,当某个类有问题只要修改这个类就行,而其继承这个类的子类往往不需要就修改

多继承中 super的好处
如果2个子类中都继承了父类,当在子类中通过父类名调用时,parent被执行了2次
如果2个子类中都继承了父类,当在子类中通过super调用时,parent被执行了1次

但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次,具体看前面的输出结果

前提 super使用父类传递参数的时候,必须将参数全部传递,否则就会报错;

什么是实例属性:
类中定义的函数下init下面的self.name = name 就是实例属性

什么是类属性:
定义的类下方的: 一个变量值;

class Province(object):
# 类属性
country = ‘中国’

def __init__(self, name):
    # 实例属性
    self.name = name

创建一个实例对象

obj = Province(‘山东省’)

直接访问实例属性

print(obj.name)

直接访问类属性

Province.country

类对象在内存中只存在一份
实例属性在每个对象中都要保存一份

所以通过类创建实例对象时候,如果每个对象需要具有相同名字的属性,那么
就使用类属性,用一份即可;

方法包括:实例方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

实例方法:由对象调用;至少一个self参数;执行实例方法时,自动将调用该方法的对象赋值给self;
类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类赋值给cls;
静态方法:由类调用;无默认参数;

Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回。

property属性的有两种方式
装饰器 即:在方法上应用装饰器
类属性 即:在类中定义值为property对象的类属性

魔法属性都有那些:

doc:用来显示类的描述信息;
_module:表示当前操作在那个模块;
_class:表示当前的对象类是什么;
_init:初始化方法;
del:当对象在内存中被释放时自动触发;
call:
dict:
str:
getitemsetitemdelitem
getslicesetslicedelslice

任何实现了 enter() 和 exit() 方法的对象都可称之为上下文管理器

猜你喜欢

转载自blog.csdn.net/weixin_44090435/article/details/88072625
今日推荐