Python与MySQL交互

每日分享:

每一个想努力的念头,都是未来的你在向现在的你求救。

目录

一、PyMySQL的使用

安装pymysql第三方包:

pymysql的使用:

1. 导入pymysql包

2. 创建连接对象

3. 获取游标对象

4. pymysql完成数据的查询操作

5. pymysql完成对数据的增删改

6. 防止SQL注入


一、PyMySQL的使用

安装pymysql第三方包:

pip install pymysql

说明:

  • 安装命令使用 pip install 第三方包名
  • 卸载命令使用 pip uninstall 第三方包
  • 可以使用pip show pymysql命令查看第三方包的信息
  • 可以使用pip list 查看使用pip命令安装的第三方包列表

pymysql的使用:

1. 导入pymysql包

import pymysql

2. 创建连接对象

调用pymysql模块中的connect()函数来创建连接对象

conn = connect(参数列表)

  • 参数host:连接的mysql主机,如果是本机则为'localhost'
  • 参数port:连接的mysql主机的端口,默认为3306
  • 参数user:连接的用户名
  • 参数password:连接的密码
  • 参数database:数据库的名称
  • 参数charset:通信采用的编码方式,一般为utf8

连接对象操作说明:

  • 关闭连接:conn.close()
  • 提交数据:conn.commit()
  • 撤销数据:conn.rollback()

3. 获取游标对象

获取游标对象的目的就是要执行sql语句,完成对数据库的增、删、改、查操作

调用连接对象的cursor()方法获取游标对象

cur = conn.cursor()

游标操作说明:

  • 使用游标执行sql语句:execute(operation [parameters])执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete、select等语句
  • 获取查询结果集中的一条数据:cur.fetchone()返回一个元组
  • 获取查询结果集中的所有数据:cur.fetchall()返回一个元组,其中每条数据也是一个元组
  • 关闭游标:cur.close() 表示和数据库操作完成

4. pymysql完成数据的查询操作

# 导包
import pymysql
# 创建连接对象
conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='数据库的密码',
    database='hello',
    charset='utf8'
)
# 获取游标对象(游标就好比一个搬运工,把sql语句交给数据库,把数据库返回的结果交给python)
cursor = conn.cursor()
sql = 'select * from students;'
# 执行sql语句
cursor.execute(sql)
# 获取查询结果(fetchone返回第一个结果,fetchall返回所有结果)
# row = cursor.fetchone()
# print(row)

res = cursor.fetchall()
for i in res:
    print(i)

# 关闭游标
cursor.close()
# 关闭连接
conn.close()

结果:

我们再对比ubuntu中数据库的数据:

5. pymysql完成对数据的增删改

import pymysql
conn = pymysql.connect(
    user='root',
    password='密码',
    host='localhost',
    database='hello',
    port=3306,
    charset='utf8'
)
cursor = conn.cursor()
# sql = 'insert into classes(name) values("新增数据");'
# sql = 'update classes set name="修改数据" where id=4;'
sql = 'delete from classes where id=4;'
try:
    # 执行sql语句
    cursor.execute(sql)
    # 提交增删改数据
    conn.commit()
except Exception as e:
    # 回滚数据,即撤销刚刚进行的sql语句操作
    conn.rollback()
finally:
    cursor.close()
    conn.close()

说明:

  • conn.commit() 表示将修改操作提交到数据库
  • conn.rollback() 表示回滚数据

添加数据之前:

运行python添加数据之后:

运行python修改数据之后:

运行python删除数据之后:

6. 防止SQL注入

什么是SQL注入?

用户提交带有恶意的数据与SQL语句进行字符串方式的拼接,从而影响了SQL语句的语义,最后出现数据泄露的现象

如何防止SQL注入?

SQL语句参数化:

  • SQL语言中的参数使用%s来占位,这不是python中的字符串格式化操作
  • 将SQL语句中%s占位所需要的参数存在一个列表(或元组或字典)中,把参数列表传递给execute方法中的第二个参数

SQL注入代码:

# 导包
import pymysql
# 创建连接对象
conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='密码',
    database='hello',
    charset='utf8'
)
# 获取游标对象(游标就好比一个搬运工,把sql语句交给数据库,把数据库返回的结果交给python)
cursor = conn.cursor()
sql = "select * from students where name= '%s';" % "张三' or 1 = 1 or'"
# 执行sql语句
cursor.execute(sql)
# 获取查询结果(fetchone返回第一个结果,fetchall返回所有结果)
# row = cursor.fetchone()
# print(row)

res = cursor.fetchall()
for i in res:
    print(i)

# 关闭游标
cursor.close()
# 关闭连接
conn.close()

结果(返回了所有数据):

防止SQL注入代码:

# 导包
import pymysql
# 创建连接对象
conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='密码',
    database='hello',
    charset='utf8'
)
# 获取游标对象(游标就好比一个搬运工,把sql语句交给数据库,把数据库返回的结果交给python)
cursor = conn.cursor()
sql = "select * from students where name= %s;"
# 执行sql语句
cursor.execute(sql, ["张三' or 1 = 1 or'"])
# 获取查询结果(fetchone返回第一个结果,fetchall返回所有结果)
# row = cursor.fetchone()
# print(row)

res = cursor.fetchall()
for i in res:
    print(i)

# 关闭游标
cursor.close()
# 关闭连接
conn.close()

结果(没有查询到结果):

正常输入时才会查询到结果:

# 导包
import pymysql
# 创建连接对象
conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='密码',
    database='hello',
    charset='utf8'
)
# 获取游标对象(游标就好比一个搬运工,把sql语句交给数据库,把数据库返回的结果交给python)
cursor = conn.cursor()
sql = "select * from students where name= %s;"
# 执行sql语句
cursor.execute(sql, ["张三"])
# cursor.execute(sql, ["张三' or 1 = 1 or'"])
# 获取查询结果(fetchone返回第一个结果,fetchall返回所有结果)
# row = cursor.fetchone()
# print(row)

res = cursor.fetchall()
for i in res:
    print(i)

# 关闭游标
cursor.close()
# 关闭连接
conn.close()

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值