MySQL(4)
多表查询
1、将SQL语句查询的结果括号括起来当作另外一条SQL语句的条件
2、链表操作
inner join 内链接 只拼接两张表中共有的部分
left join 以左表为基准展示所有内容,也就是说,除了拼接共有的部分,会将左表剩余的内容保存
right join 除了拼接共有的部分,会将右表剩余的内容保存
union 全链接,除了链接共有的部分,会将左右表剩余的内容保存
python操作Mysql
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, database='judy', user='root', password='14zhy') #链接数据库服务端
cursor = conn.cursor(cursor=pymysql.cursor.DictCursor) # 产生一个游标对象
sql = "select * from userinfo;"
rows = cursor.execute(sql) # 执行sql回返回影响成功的行数。将结果放入一个集合,等待被查询
# cursor.scroll(3,mode="absolute") # 相对绝对位置移动
# cursor.scroll(3,mode="relative") # 相对当前位置移动、
res1 = cursor.fetchone()
res2 = cursor.fetchone()
res3 = cursor.fetchone()
res4 = cursor.fetchmany(2)
res5 = cursor.fetchall()
print(res1)
print(res2)
print(res3)
print(res4)
print(res5)
print('%s rows in set (0.00 sec)' % rows)
conn.commit() # 提交事物 可以设置自动提交
cursor.close()
conn.close()
SQL注入问题
🌼 例子
import pymysql
conn = pymysql.connect(
host='127.0.0.1', port=3306, user='root', password='123', database='judy',
charset='utf8', autocommit=True)
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
username=input('username>>>:').strip()
pwd=input('password>>>:').strip()
sql='select * from userinfo where name="%s" and password="%S"'%(username,pwd)
cursor.execute(sql)
以上代码容易出现只要用户名也可以登入的问题或者不需要用户名和密码登入的问题;
🌼 解决方法
sql='select * from userinfo where name="%s" and password="%S"'
cursor.execute(sql,(username,pwd))
事物
一、事物的特性
ACID
A:原子性
C:一致性
I:隔离性
D:持久性
(1)原子性(atomicity)
一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
(2)一致性(consistency)
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
(3)隔离性(isolation)
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
(4)持久性(durability)
持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响
二、事物的相关操作
start transcation;
<中间就是sql语句>
rollback # 回滚到操作之间的状态,也是结束事物的操作
commit # 确认事物操作,之后不能回滚,只要没有commit操作,数据就没有真正被疏导硬盘
三、在python代码角度,应该实现的伪代码逻辑
try:
sql语句
except 异常:
rollback;
else:
commit;
浙公网安备 33010602011771号