Python 与 MySQL 交互

PyMySQL 的安装

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

安装 pymysql 第三方包:pip install pymysql

PS D:\tmp> pip install pymysql
Collecting pymysql
  Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)
     ---------------------------------------- 43.8/43.8 kB 179.6 kB/s eta 0:00:00
Installing collected packages: pymysql
Successfully installed pymysql-1.0.2

PS D:\tmp> pip show pymysql
Name: PyMySQL
Version: 1.0.2
Summary: Pure Python MySQL Driver
Home-page: https://github.com/PyMySQL/PyMySQL/
Author: yutaka.matsubara
Author-email: yutaka.matsubara@gmail.com
License: "MIT"
Location: c:\users\administrator\appdata\local\packages\pythonsoftwarefoundation.python.3.9_qbz5n2kfra8p0\localcache\local-packages\python39\site-packages
Requires:
Required-by:
PS D:\tmp>

说明:

  • 安装命令使用 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() 表示和数据库操作完成

pymysql 完成数据的查询操作

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

结果:

PS E:\pdf1> python .\img.py
(1, '计秀兰', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'rtdgo4jo52', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(2, '郭子安', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'D6dlh6DXLY', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(3, '李全安', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'B8hzJBseiG', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
PS E:\pdf1>

在这里插入图片描述

pymysql 完成对数据的增删改

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

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

防止 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 users 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()

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

PS E:\pdf1> python .\img.py
(1, '计秀兰', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'rtdgo4jo52', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(2, '郭子安', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'D6dlh6DXLY', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
(3, '李全安', '[email protected]', '$2y$10$qGnquE.Nd8g5XHJaIquSZuSBhw6AN.FeO.BxwY90poGdYohAlRh66', None, 0, None, 'B8hzJBseiG', datetime.datetime(2022, 7, 1, 3, 40, 26), datetime.datetime(2022, 7, 1, 3, 40, 26))
PS E:\pdf1>

防止 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 users 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()

猜你喜欢

转载自blog.csdn.net/weiguang102/article/details/126128037