Pymysql:就是一个python程序连接数据库的第三方包,需要下载才能导入功能,并使用其包含的方法
一、下载
第一步:首先打开python编译器pycharm,再点击terminal终端窗口
第二步:输入pip3 install pymysql -i Simple Index
第三步:看到Successfully字样,即安装成功
二、操作数据库的步骤
1、导入pymysql包
import pymysql
2、连接数据库
con = pymysql.connect(host='localhost', user='root', password='admin', database='demo_07_04', charset='utf8')
这几个参数的含义:
- host:你要访问的数据库的IP地址
- user:数据库的用户名
- password:数据库的密码
- database:你要访问的数据库名
- charset:编码格式,为了可以识别中文,一般情况下编码格式为utf8
- autocommit:提交参数(两种状态)
- True:自动提交
- False:手动提交(默认值)
当写到这里的时候,可以运行一下,如果连接成功,会获得一个链接对象,如果连接失败,会抛出异常。
注意:还需要通过连接对象,创建一个cursor游标对象,游标分为两种类型
- 元组类型游标---》默认值
cur = con.cursor()
- 字典类型游标
- 方式一
- cur = con.cursor(cursor=pymysql.cursors.DictCursor)
- 方式二:直接在connect方法中设置
- cursorclass=pymysql.cursors.DictCursor
3、操作数据(增删改查)
execute()函数:用来执行sql语句,返回一个int类型的数量
num = cur.execute('sql语句')
注意:增删改查四种操作中,num含义不同
- 增删改
- num表示的是影响行数,还需要commit()手动提交 con.commit()
- 查
- num表示的是查询的数量
- fetchone()函数:获得一条数据,以元组类型返回
- fetchall()函数:获得所有数据,以元组嵌套的方式返回
4、关闭连接、数据库
注意:要先关闭游标,在关闭连接
cur.close() con.close()
三、事务的使用
事务的存在是为了保证数据的完整性,安全性,修改数据的时候要么同时成功、要么同时失败
- commit():提交数据
- rollbak():回滚数据
对于有异常的sql语句,需要用try、except包围
try:
异常sql语句
con.commit()
except Exception as 取别名:
con.rollback()
输出异常
四、with优化文件操作
import pymysql
class DB(object):
def __init__(self, host='localhost', user='root', password='admin', database='', charset='utf8'):
# 连接数据库,初始化
self.con = pymysql.connect(
host=host, user=user, password=password, database=database, charset=charset
)
# 通过连接对象,创建一个cursor游标对象
self.cur = self.con.cursor()
# 当使用with语法糖的时候,自动调用该方法,并返回当前游标对象
def __enter__(self):
return self.cur
# 退出with语法糖的时候,会调用这个方法
def __exit__(self, exc_type, exc_val, exc_tb):
self.con.commit() # 在关闭连接前先提交
self.cur.close()
self.con.close()
if __name__ == '__main__':
with DB(database='demo_07_04') as db:
num = db.execute("select * from userinfo")
for userid, userName, passWord in db:
print(userid, userName, passWord)
运行结果如下:
五、注入式攻击
上图出现了注入式攻击,任意输入用户名,再像如图所示输入密码,就会登陆成功。
如何解决注入式攻击呢?
把sql语句中,动态添加的数据用一个占位符%s来替代就可以解决上述问题
db.execute("select * from userinfo where userName = %s and userPsw = %s", (数据1,数据2))
# 案例
sql = f"select * from userinfo where userName = %s and userPsw = %s"
num = curr.execute(sql, (uN, uP)) # num获得的是数据的条数 如果你输入正确了 这个num至少是1 查不到这个账号num = 0
if num != 0:
print(f'欢迎回来,{uN}')
else:
print('用户名或密码错误,请检查你的账号和密码...')
本人经验不足,如有写的不对不好的地方,欢迎评论区留言指出。