8.6.1 python3的mysql模块pymysql

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

二 链接、执行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()

# 判断

if row:
    print("登录成功")
else:
    print("登录失败")
C:Python35python.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

# 查询
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

在插入之前查看数据库

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:Python35python.exe D:MySQL/mysql模块之增删改查.py
21

此时查看数据库自增的ID

原文地址:https://www.cnblogs.com/caimengzhi/p/8586078.html