MySQl 数据库 之 python模块 pymysql 简单介绍

Posted 赵振宇

tags:

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

一. 下载:

终端输入指令: pip3 install pymysql

如果失败就检查 pip 指令的环境变量是否配置;
若不会,则自行百度;

等待下载完成后, 在终端直接进入 python 环境, 导入该模块, 若无报错,则证明下载成功.(如下图所示)

 

二. 开始使用:

1, 在py文件中导入该模块:

import pymysql

2, 连接数据库服务器:

复制代码
conn = pymysql.connect(host=\'127.0.0.1\', port=3306, user=\'root\', password=\'\', db=\'db8\', charset=\'utf8\')

# 参数解读:
# host: 服务器地址;
# port: 服务器端口号, 这里注意要是 int;
# user: 登录用户;
# password: 用户密码;
# db: 要连接的库的名字;
# charset: 编码格式;
复制代码

3, 创建游标:

cursor = conn.cursor()

4, 执行sql语句:

sql = "select * from userinfo where username=\'%s\' and pwd=\'%s\'" %(user, pwd) # %s 一点要引起来.
result=cursor.execute(sql)
print(result)  # 这里打印的是数据的个数.

# 注意: : : : 这里会产生sql 注入的问题, 后面会写, 要着重注意这一点

5, 关闭游标, 断开连接,  这里注意 一定要关闭,断开, 不然会产生内容浪费, 无法释放:

cursor.close()
conn.close()

 

实例: 使用Python实现用户登录,如果用户存在则登录成功(假设该用户已在数据库中)

import pymysql
user = input(\'请输入用户名:\')

pwd = input(\'请输入密码:\')



# 1.连接
conn = pymysql.connect(host=\'127.0.0.1\', port=3306, user=\'root\', password=\'\', db=\'db8\', charset=\'utf8\')


# 2.创建游标
cursor = conn.cursor()

#注意%s需要加引号
sql = "select * from userinfo where username=\'%s\' and pwd=\'%s\'" %(user, pwd)
print(sql)

# 3.执行sql语句
cursor.execute(sql)

result=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
print(result)


# 关闭连接,游标和连接都要关闭
cursor.close()
conn.close()

if result:
    print(\'登陆成功\')
else:
    print(\'登录失败\')
实现:使用Python实现用户登录,如果用户存在则登录成功(假设该用户已在数据库中)

2.1 execute() sql注入的问题:

复制代码
#最后那一个空格,在一条sql语句中如果遇到select * from userinfo where username=\'mjj\' -- asadasdas\' and pwd=\'\' 则--之后的条件被注释掉了(注意--后面还有一个空格)

#1、sql注入之:用户存在,绕过密码
mjj\' -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码
xxx\' or 1=1 -- 任意字符
复制代码

2.2 解决sql注入的问题的方法:

复制代码
# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name=\'%s\' and password=\'%s\'" %(username,pwd)
# print(sql)
# result=cursor.execute(sql)

#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上, 且还会自动去空格.
result=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
复制代码

 

三. 对目标表进行增, 删, 改操作:  ( 注意无论是那个操作一定要进行conn.commit(), 不然数据会丢失);

commit()方法:在数据库里增、删、改的时候,必须要进行提交,否则插入的数据不生效。

复制代码
import pymysql

username = input(\'请输入用户名:\')
pwd = input(\'请输入密码:\')

conn = pymysql.connect(host=\'localhost\', port=3306, user=\'root\', password=\'\', db=\'db8\', charset=\'utf8\')
cursor = conn.cursor()


# 增:

# 插入一条数据:
# sql = "insert into userinfo(username,pwd) values (%s,%s)"
# effect_row = cursor.execute(sql,(username,pwd))

# 同时插入多条数据:
# cursor.executemany(sql,[(\'李四\',\'110\'),(\'王五\',\'119\')]) 



# 改:

# sql = "update userinfo set username = %s  where id = 2"
# effect_row = cursor.execute(sql,username)


# 删:

# sql = "delete from userinfo  where id = 2"
# effect_row = cursor.execute(sql)

#一定记得commit
conn.commit()

# 4.关闭游标
cursor.close()

# 5.关闭连接
conn.close()
复制代码

 

四. 查:fetchone()、fetchmany()、fetchall()

fetchone():  获取下一行数据,第一次为首行;

fetchall():   获取所有行数据源;

fetchmany(4):  获取4行数据;  ( 对于分页查询很有帮助)

默认情况下,我们获取到的返回值是元组,只能看到每行的数据,却不知道每一列代表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  #在实例化的时候,将属性cursor设置为pymysql.cursors.DictCursor

以上是关于MySQl 数据库 之 python模块 pymysql 简单介绍的主要内容,如果未能解决你的问题,请参考以下文章

pymysql 基操全套

Python 3.5安装 pymysql 模块

mysql pymysql 模块

Python中pymysql基本使用

Python连接MySQL数据库之pymysql模块使用

Python连接MySQL数据库之pymysql模块使用