• 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    说明:

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

    PyMySQL 的使用

    1 导入 pymysql 包

    import pymysql
    
    • 1

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

    conn = connect(参数列表)
    
        参数host:连接的mysql主机,如果是本机则为'localhost'
        参数port:连接的mysql主机的端口,默认为3306
        参数user:连接的用户名
    参数password:连接的密码
    参数database:数据库的名称
     参数charset:通信采用的编码方式,一般为utf8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    连接对象操作说明:

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

    3 获取游标对象

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

    调用连接对象的 cursor()方法获取游标对象
    
    cur = conn.cursor()
    
    • 1
    • 2
    • 3

    游标操作说明:

    • 使用游标执行 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    结果:

    PS E:\pdf1> python .\img.py
    (1, '计秀兰', 'velit_ducimus@example.com', '$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, '郭子安', 'wdolores@example.net', '$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, '李全安', 'qcum@example.org', '$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>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    说明:
    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

    PS E:\pdf1> python .\img.py
    (1, '计秀兰', 'velit_ducimus@example.com', '$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, '郭子安', 'wdolores@example.net', '$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, '李全安', 'qcum@example.org', '$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>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    防止 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    ElementUI浅尝辄止27:Steps 步骤条
    jQuery获取地址栏GET参数值
    万邦抖音获取douyin分享口令url API
    dolphinscheduler负载均衡源码
    操作系统概述
    SpringBoot笔记——登录
    Lombok
    07、Metasploit渗透测试框架的基本使用
    算法与数据结构 --- 线性表 --- 链式表示与实现(下)
    网络七层协议
  • 原文地址:https://blog.csdn.net/weiguang102/article/details/126128037