pymysql模块

Posted Python小白白白白白白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pymysql模块相关的知识,希望对你有一定的参考价值。

pymysql 模块

用于python代码与数据库交互的模块

 

一、基础使用

使用方式:

① 连接数据库,返回一个连接,存储在变量中

② 获取光标对象(只有拿到光标才能执行sql语句)

③ sql语句

④ 使用光标对象执行sql语句

⑤ 关闭光标对象,关闭连接

 

‘‘‘
登陆验证
‘‘‘

import pymysql


user = input(请输入用户名:).strip()
pwd = input(请输入密码:).strip()
# 连接数据库
sqlconn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123456,
    database = pymysqldb,
    charset = utf8
)

# 获取光标对象
sqlcur = sqlconn.cursor()

# sql语句
sql = "select * from account where username = ‘%s‘ and password = ‘%s‘;" % (user,pwd)
print(sql)

# 使用光标对象执行sql语句
ret = sqlcur.execute(sql)

# 关闭光标对象
sqlcur.close()

# 关闭数据库连接
sqlconn.close()

if ret:print(登陆成功)
else:print(登陆失败)

 

 

二、sql注入

恶意的sql语句,利用--绕过验证,后端拿到用户输入的内容不做检测直接左字符串的凭借,得到一个和预期不一致的语句

 

# 注入语句
请输入用户名:xiaoming-- 
请输入密码:1
select * from account where username = xiaoming-- ‘‘ and password = 1
登陆成功
# 注入语句2
请输入用户名:xiao or 1=1 -- 
请输入密码:1
select * from account where username = xiao or 1=1 -- ‘‘ and password = 1
登陆成功

 

解决方案:

对输入的内容做检测,pymysql内置了检测,让pymysql拼接sql语句即可

按照pymysql模块的写法定义好占位符,利用pymysql模块拼接sql语句

sql语句用占位符,光标对象.execute(sql,[参数,参数])

‘‘‘
登陆验证
‘‘‘

import pymysql


user = input(请输入用户名:).strip()
pwd = input(请输入密码:).strip()
# 连接数据库
sqlconn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123456,
    database = pymysqldb,
    charset = utf8
)
# 获取光标对象
sqlcur = sqlconn.cursor()
# sql语句(按照pymysql的语句定义占位符)
sql = "select * from account where username=%s and password=%s;"
# 利用光标执行sql语句(利用pymysql拼接sql语句)
ret = sqlcur.execute(sql,[user,pwd])
# 关闭光标对象
sqlcur.close()
# 关闭数据库连接
sqlconn.close()
if ret:print(登陆成功)
else:print(登陆失败)

 

三、数据库的增删改

设计数据库的操作,必须用commit() 方法

‘‘‘
数据库的增删改
‘‘‘

import pymysql

# 连接数据库
sqlconn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123456,
    database = pymysqldb,
    charset = utf8
)

# 获取光标对象
sqlcur = sqlconn.cursor()

# sql语句(按照pymysql的语句定义占位符)
sql = "insert into account values (%s,%s)"      #
sql1 = "update account set password = %s where username = %s;"  #
sql2 = "delete from account where username = %s"    #

# 利用光标执行sql语句(利用pymysql拼接sql语句)
sqlcur.execute(sql,[xiao,123])
sqlcur.execute(sql1,[456,xiao])
sqlcur.execute(sql2,[xiao])

# 操作数据库需要提交
sqlconn.commit()

# 关闭
sqlcur.close()
sqlconn.close()

 

四、其他方法

光标对象.fetchall()          获取查询到的所有结果,以元组的形式返回

光标对象.fetchone()          获取查询到的一个结果,类似于生成器,一个一个获取

光标对象.fetchmany(N)       指定获取查询到的N条记录

import pymysql


sqlconn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123456,
    database = pymysqldb,
    charset = utf8
)
sqlcur = sqlconn.cursor()

sql = "select * from account"

sqlcur.execute(sql)

ret = sqlcur.fetchall()
print(ret)  # ((‘dog‘, ‘123‘), (‘fish‘, ‘123‘), (‘monkey‘, ‘123‘), (‘pig‘, ‘123‘), (‘xiaobai‘, ‘123‘), (‘xiaoming‘, ‘123‘))


sqlcur.close()
sqlconn.close()

‘‘‘
结果
((‘dog‘, ‘123‘), (‘fish‘, ‘123‘), (‘monkey‘, ‘123‘), (‘pig‘, ‘123‘), (‘xiaobai‘, ‘123‘), (‘xiaoming‘, ‘123‘))
‘‘‘

 

import pymysql


sqlconn = pymysql.connect(
    host = 127.0.0.1,
    port = 3306,
    user = root,
    password = 123456,
    database = pymysqldb,
    charset = utf8
)
sqlcur = sqlconn.cursor()

sql = "select * from account"

sqlcur.execute(sql)

# ret = sqlcur.fetchall()
# print(ret)  # ((‘dog‘, ‘123‘), (‘fish‘, ‘123‘), (‘monkey‘, ‘123‘), (‘pig‘, ‘123‘), (‘xiaobai‘, ‘123‘), (‘xiaoming‘, ‘123‘))

ret = sqlcur.fetchmany(2)
print(ret)      # ((‘dog‘, ‘123‘), (‘fish‘, ‘123‘))
ret = sqlcur.fetchone()
print(ret)      # (‘monkey‘, ‘123‘)

sqlcur.close()
sqlconn.close()

 

连接对象.rollback()    回滚,撤销操作

光标对象.scroll(1,mode=‘absolute‘)  绝对位置,移动到第一行末尾,从第二行开始查

光标对象.scroll(1,mode=‘relative‘)    相对位置,基于当前位置往后移动(可以使用负数,往前移动),但索引越界会报错

 

获取id

光标对象.lastrowid     获取最后一条记录的id

以上是关于pymysql模块的主要内容,如果未能解决你的问题,请参考以下文章

MySQL5.7-pymysql模块和SQL注入

数据库可视化和pymysql模块

pymysql 模块简单使用

pymysql模块初识

pymysql模块的简单操作

Python pymysql模块