python3 mysql模块_8.6.1 python3的mysql模块pymysql

之前我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库,那如何在python程序中操作数据库呢?这就用到了pymysql模块,该模块本质就是一个套接字客户端软件,使用前需要事先安装

9df0ac749b9f89db8c8cac5e6378ccb8.png

二 链接、执行sql、关闭(游标)

import pymysql

login_user=input("user>>").strip()

login_pwd= input("passwor>>").strip()

# 建立连接

conn=pymysql.connect(

host="127.0.0.1",

port=3306,

user="cmz",

passwd="cmz",

db="leco",

charset="utf8")

# 拿到游标

cursor=conn.cursor()

sql= 'select * from userinfo where user ="%s" and pwd="%s"' %(login_user, login_pwd)

row=cursor.execute(sql)

cursor.close()

conn.close()

# 判断ifrow:

print("登录成功")else:

print("登录失败")

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

C:\Python35\python.exe D:/MySQL/mysql基本使用.py

user>>cmz

passwor>> 123登录成功

View Code

三 execute()之sql注入

注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符

根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='cmz';则--之后的条件被注释掉了

#1、sql注入之:用户存在,绕过密码

cmz'-- 任意字符 # --在MySQL中表示注释

#2、sql注入之:用户不存在,绕过用户与密码

xxx'or 1=1 -- 任意字符

user>> xxx"or 1=1 -- jaa

passwor>>

select * from userinfo where user ="xxx" or 1=1 -- jaa"and pwd=""登录成功

解决方法:

# 原来是我们对sql进行字符串拼接

# sql="select * from userinfo where name='%s' and password='%s'" %(login_user,login_pwd)

# print(sql)

# res=cursor.execute(sql)

#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)

sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上

res=cursor.execute(sql,[login_user,login_pwd]) #[login_user,login_pwd] 和 (login_user,login_pwd) 都有可以

#pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

四 增、删、改:conn.commit()

增删改

import pymysql

# 建立连接

conn=pymysql.connect(

host="127.0.0.1",

port=3306,

user="cmz",

passwd="cmz",

db="leco",

charset="utf8")

# 拿到游标

cursor=conn.cursor()

# 增删改

sql= 'insert into userinfo(user,pwd) values(%s, %s)'# row= cursor.execute(sql,("xxx",'123'))

row= cursor.executemany(sql,[('yxx','123'),('cmz1','111'),('cmz2','2222')]) # #执行sql语句,返回sql影响成功的行数

print(row)

conn.commit() #提交后才发现表中插入记录成功

cursor.close()

conn.close()

五 查:fetchone,fetchmany,fetchall

739d1d0a5de66398dd00405fc9bbe896.png

# 查询

import pymysql

# 建立连接

conn=pymysql.connect(

host="127.0.0.1",

port=3306,

user="cmz",

passwd="cmz",

db="leco",

charset="utf8")

# 拿到游标

# cursor=conn.cursor(pymysql.cursors.DictCursor)

cursor=conn.cursor(pymysql.cursors.DictCursor)

# 查询

row= cursor.execute('select * from userinfo;') #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询

print(row)

# print(cursor.fetchall()) # 一次取全部

# print(cursor.fetchmany(2)) # 一次取N(2)条

# print(cursor.fetchone()) # 一次取一条

# print(cursor.fetchone()) # 一次取一条

# print(cursor.fetchone()) # 一次取一条

#

# cursor.scroll(3,mode='absolute') # 相对绝对位置移动

# cursor.scroll(3,mode='relative') # 相对当前位置移动

# cursor.scroll(3,mode='absolute') # 相对绝对位置移动

print(cursor.fetchone())

print(cursor.fetchone())

cursor.scroll(2,mode='relative') # 向后移动两条数据

print(cursor.fetchone())

conn.commit()

cursor.close()

conn.close()

结果:

12{'user': 'cmz', 'id': 1, 'pwd': '123'}

{'user': 'leco', 'id': 2, 'pwd': '456'}

{'user': 'cmz1', 'id': 5, 'pwd': '111'}18

五 获取插入的最后一条数据的自增ID

在插入之前查看数据库

cd937b6d58d91267739ddc01d1687ab1.png

id在15

import pymysql

# 建立连接

conn=pymysql.connect(

host="127.0.0.1",

port=3306,

user="cmz",

passwd="cmz",

db="leco",

charset="utf8")

# 拿到游标

cursor=conn.cursor()

# 插入

sql= 'insert into userinfo(user,pwd) values(%s, %s)'# row= cursor.execute(sql,("xxx",'123'))

row= cursor.executemany(sql,[('cc1','123'),('cc2','111'),('cc3','2222')]) # 一次性插入多条

print(cursor.lastrowid) #获取插入的最后一条数据的自增ID

conn.commit()

cursor.close()

conn.close()

结果是

C:\Python35\python.exe D:MySQL/mysql模块之增删改查.py21

此时查看数据库自增的ID

e3c7d11245d5321bf647dea34f5c0d89.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值