Python进阶系列
Python进阶-网络编程-01
Python进阶-网络编程-02
Python进阶-网络编程-03
Python进阶-多任务编程-01
Python进阶-多任务编程-02
Python进阶-多任务编程-03
Python进阶-正则表达式
Python进阶-数据库编程-01
Python进阶-数据库编程-02
Python进阶-数据库编程-03
Python进阶-数据库编程-04
Python进阶-数据拷贝问题
Python进阶-模块导入问题
Python进阶-miniWeb框架
文章目录
12.1. 外键使用
-
外键的概念:一个表的主键在另外一个表中出现,在另外一个表中称为外键
-
作用:表间的数据插入、更新时候的一种约束
-
创建外键:
-
已经存在的表建立外键:
alter table 表名 add foreign key(当前表的字段) references 表名(字段)
-
创建表的时候创建外键:
create table good_test( id int primary key auto_increment, name varchar(150) not null, cate_id int unsigned not null, brand_id int unsigned not null, -- 创建外键 foreign key(cate_id) references goods_cates(id), foreign key(brand_id) references goods_brands(id) );
-
-
删除外键:
-
查看外键名称:
show create table 表名;
alter table 表名 drop foreign key 外键名;
-
12.2. 视图的概念和使用
-
概念:虚拟表,仅仅支持查询,把复杂的SQL语句的功能封装成一个虚表
-
创建视图
create view 视图名 as select …
注意:
v_
开头 -
查询视图
show tables;
-
使用视图
视图只能用来查询,查询时和使用普通表效果一致
select * from v_goods_info;
-
删除视图
drop view 视图名;
12.3. 事务的概念及特性
- 事务概念:事务
Transaction
,是指作为一个基本工作单元执行的一系列SQL语句的操作 - 作用:要么完全地执行,要么完全地都不执行
- 事务的特性ACID:
- A原子性:事务的操作是原子的,不能分隔
- C一致性:双方的结果要一致
- I 隔离性:同一时间只有一个事务在操作
- D持久性:操作完成结果持久不变
12.4. 事务使用
-
步骤:
-
开启事务:
begin;
-
操作数据库:
insert update delete
-
确认修改:
commit;
-
回滚:
rollback;
-
12.5. 验证事务的ACID特性
-
commit;
客户端A更新数据
客户端B查询
如果A不commit B看到的必然是老数据
-
rollback;
-
验证隔离性:同一时间修改同一个字段
12.6. 数据库三范式
- 范式:设计数据库的一些原则
- 数据库设计的3范式:
- 1NF 字段必须是原子的,不可分割
- 2NF 满足1NF,必须要有主键,非主键字段必须完全依赖主键,而不能部分依赖
- 3NF 满足2NF,所有非主键字段必须依赖主键,不能存在传递依赖的情况
12.7. E-R模型及表间关系
- 表间关系:
- 一对一:一个表中的一条数据,能够和另外一个表的唯一一条数据对应(人和常住地址)
- 一对多:一个表中的一条数据,能够和另外一个表的多条数据对应(一个班有多个学生)
- 多对多:一个表中的一条数据,能够和另外一个表的多条数据对应,相反也成立。(学生和课程)
12.8. Python连接MySQL
-
作用:使用python代码充当客户端,连接数据库进行操作
-
步骤:
-
导入模块
pymysql
import pymysql
-
建立连接对象
pymysql.connect()
# host 主机 # user 用户名 # password 密码 # database 指定数据库 conn=pymysql.connect(host='localhost',user='root',password='107314',database='jing_dong',charset='utf8')
-
创建游标对象
conn.cursor()
cur = conn.cursor()
-
使用游标对象执行SQL语句
# 查询goods表中的所有信息,按照倒序排序 result = cur.execute("select * from goods order by id desc") # result返回查询的数据条数 print("查询的数据条数为:%s" % result)
-
获取执行的结果
# 获取所有数据,返回的是元组类型 result_list = cur.fetchall() # 获取一条数据 result_list = cur.fetchone()
-
打印输出获取的内容
print(result_list)
-
关闭游标对象
cur.close()
-
关闭连接对象
conn.close()
-
-
代码实例:
# 1.导入模块 import pymysql # 2.建立连接对象 pymysql.connect() conn=pymysql.connect(host='localhost',user='root',password='107314',database='jing_dong',charset='utf8') # 3.创建游标对象 cur = conn.cursor() # 4.使用游标对象执行SQL语句 result = cur.execute("select * from goods order by id desc") print("查询的数据条数为:%s" % result) # 5.获取执行的结果 # 获取一条数据 result_list = cur.fetchone() # 6.打印输出获取的内容 print(result_list) # 7.关闭游标对象 cur.close() # 8.关闭连接对象 conn.close()
12.9. Python操作数据库CURD
-
操作步骤
-
导入模块 pymysql
-
建立连接对象 pymysql.connect()
-
创建游标对象
-
使用游标对象执行SQL语句 execute()
-
提交
conn.commit()
-
获取执行的结果(影响的行数)并打印执行的结果
-
关闭游标对象
-
关闭连接对象
-
12.10. SQL防注入
-
防注入的思路:
-
sql中需要变化的地方,可以占位符%s %d……
sql = "select * from goods where name = %s order by id desc"
注意:SQL可以出现多个占位符,后续列表中的元素要与之对应
-
把参数封装到列表中
params = [input_name]
-
把列表传递给excute(sql,列表)
result = cur.execute(sql,params)
-