• 【Python】从入门到上头—mysql数据库操作模块mysql-connector和PyMySQL应用场景 (15)


    mysql-connector

    MySQL官方提供了mysql-connector-python驱动

    1. 安装驱动

      python -m pip install mysql-connector
      
      • 1
    2. 连接数据库获取连接

      import mysql.connector
      
      db = mysql.connector.connect(
          host="localhost", #ip
          user="root", #用户名
          passwd="root",#密码
          database="python_test",#连接数据库
          auth_plugin='mysql_native_password'
      )
      #获取游标
      cursor = db.cursor()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

    创建数据库

    cursor.execute("CREATE DATABASE python_test")
    
    • 1

    输出所有数据库列表:

    cursor.execute("SHOW DATABASES")
    for x in cursor:
        print(x)
    """
    ('basic_project',)
    ('ceam_mall2',)
    ('information_schema',)
    ('jwt-demo',)
    ('liugh',)
    ('mysql',)
    ('niu_b_xx_hou',)
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    创建数据表

    cursor.execute("CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))")
    
    • 1

    输出所有数据库表:

    cursor.execute("SHOW TABLES")
    for x in cursor:
        print(x)
    #('sites',)
    
    • 1
    • 2
    • 3
    • 4

    主键设置

    cursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")
    
    • 1

    插入数据

    #sql
    sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
    #占位符插入数据
    val = ("RUNOOB", "https://www.baidu.com")
    #执行sql
    cursor.execute(sql, val)
    
    db.commit()
    print(cursor.rowcount, "记录插入成功。")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    批量插入

    • 批量插入使用 executemany() 方法,该方法的第二个参数是一个元组列表,包含了我们要插入的数据:
    sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
    val = [
        ('Google', 'https://www.google.com'),
        ('Github', 'https://www.github.com'),
        ('Taobao', 'https://www.taobao.com'),
        ('stackoverflow', 'https://www.stackoverflow.com/')
    ]
    #执行sql
    cursor.executemany(sql, val)
    #提交事务: 数据表内容有更新,必须使用到该语句
    db.commit()
    print(cursor.rowcount, "记录插入成功。")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如果我们想在数据记录插入后,获取该记录的 ID ,可以使用以下代码:

    sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
    val = ("Zhihu", "https://www.zhihu.com")
    cursor.execute(sql, val)
    db.commit()
    print("1 条记录已插入, ID:", cursor.lastrowid)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查询数据

    cursor.execute("SELECT * FROM sites")
    result = cursor.fetchall()  # fetchall() 获取所有记录
    for x in result:
    	print(x)
    """
    ('RUNOOB', 'https://www.runoob.com', 1)
    ('Google', 'https://www.google.com', 2)
    ('Github', 'https://www.github.com', 3)
    ('Taobao', 'https://www.taobao.com', 4)
    ('stackoverflow', 'https://www.stackoverflow.com/', 5)
    ('Zhihu', 'https://www.zhihu.com', 6)
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    如果我们只想读取一条数据,可以使用 fetchone() 方法:

    cursor.execute("SELECT * FROM sites")
    result = cursor.fetchone()
    print(result)
    
    • 1
    • 2
    • 3

    为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义查询的条件

    sql = "SELECT * FROM sites WHERE name = %s"
    na = ("RUNOOB",)
    cursor.execute(sql, na)
    result = cursor.fetchall()
    for x in result:
        print(x)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    删除

    sql = "DELETE FROM sites WHERE name = %s"
    na = ("stackoverflow",)
    cursor.execute(sql, na)
    db.commit()
    print(cursor.rowcount, " 条记录删除")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    更新

    sql = "UPDATE sites SET name = %s WHERE name = %s"
    val = ("Zhihu", "ZH")
    cursor.execute(sql, val)
    db.commit()
    print(cursor.rowcount, " 条记录被修改")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    关闭连接

    #最后一定要关闭数据库连接
    db.close()
    
    • 1
    • 2

    Python连接MySQL报错:mysql.connector.errors.NotSupportedError: Authentication plugin ‘caching_sha2_password’ is not supported

    • 添加一句语句(auth_plugin=‘mysql_native_password’),添加位置如下代码:

    在这里插入图片描述

    小结

    • 执行INSERT/UPDATE/DELETE等操作后要调用commit()提交事务;
    • MySQL的SQL占位符是%s

    PyMySQL

    PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2 中则使用 mysqldb。

    • PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。
    1. 安装

      pip3 install PyMySQL
      
      • 1
    2. 数据库连接

      import pymysql
       
      # 打开数据库连接
      db = pymysql.connect(host='localhost',
                           user='root',
                           password='root',
                           database='python_test')
       
      # 使用 cursor() 方法创建一个游标对象 cursor
      cursor = db.cursor()
       
      # 使用 execute()  方法执行 SQL 查询 
      cursor.execute("SELECT VERSION()")
       
      # 使用 fetchone() 方法获取单条数据.
      data = cursor.fetchone()
       
      print ("Database version : %s " % data)
       
      # 关闭数据库连接
      db.close()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

    创建数据库表

    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect(host='localhost',
                         user='testuser',
                         password='test123',
                         database='TESTDB')
     
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
     
    # 使用 execute() 方法执行 SQL,如果表存在则删除
    cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
     
    # 使用预处理语句创建表
    sql = """CREATE TABLE EMPLOYEE (
             FIRST_NAME  CHAR(20) NOT NULL,
             LAST_NAME  CHAR(20),
             AGE INT,  
             SEX CHAR(1),
             INCOME FLOAT )"""
     
    cursor.execute(sql)
     
    # 关闭数据库连接
    db.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

    数据库插入操作

    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect(host='localhost',
                         user='testuser',
                         password='test123',
                         database='TESTDB')
     
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
     
    # SQL 插入语句
    sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
             LAST_NAME, AGE, SEX, INCOME)
             VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
    try:
       # 执行sql语句
       cursor.execute(sql)
       # 提交到数据库执行
       db.commit()
    except:
       # 如果发生错误则回滚
       db.rollback()
     
    # 关闭数据库连接
    db.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

    以上例子也可以写成如下形式:

    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect(host='localhost',
                         user='testuser',
                         password='test123',
                         database='TESTDB')
     
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
     
    # SQL 插入语句
    sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
           LAST_NAME, AGE, SEX, INCOME) \
           VALUES ('%s', '%s',  %s,  '%s',  %s)" % \
           ('Mac', 'Mohan', 20, 'M', 2000)
    try:
       # 执行sql语句
       cursor.execute(sql)
       # 执行sql语句
       db.commit()
    except:
       # 发生错误时回滚
       db.rollback()
     
    # 关闭数据库连接
    db.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

    数据库查询操作

    • Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

      • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
      • fetchall(): 接收全部的返回结果行.
      • rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

    查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:

    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect(host='localhost',
                         user='testuser',
                         password='test123',
                         database='TESTDB')
     
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
     
    # SQL 查询语句
    sql = "SELECT * FROM EMPLOYEE \
           WHERE INCOME > %s" % (1000)
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 获取所有记录列表
       results = cursor.fetchall()
       for row in results:
          fname = row[0]
          lname = row[1]
          age = row[2]
          sex = row[3]
          income = row[4]
           # 打印结果
          print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
                 (fname, lname, age, sex, income ))
    except:
       print ("Error: unable to fetch data")
     
    # 关闭数据库连接
    db.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
    • 29
    • 30
    • 31
    • 32
    • 33

    数据库更新操作

    • 将 TESTDB 表中 SEX 为 ‘M’ 的 AGE 字段递增 1:
    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect(host='localhost',
                         user='testuser',
                         password='test123',
                         database='TESTDB')
     
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
     
    # SQL 更新语句
    sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 提交到数据库执行
       db.commit()
    except:
       # 发生错误时回滚
       db.rollback()
     
    # 关闭数据库连接
    db.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

    删除操作

    • 删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:
    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect(host='localhost',
                         user='testuser',
                         password='test123',
                         database='TESTDB')
     
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
     
    # SQL 删除语句
    sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 提交修改
       db.commit()
    except:
       # 发生错误时回滚
       db.rollback()
     
    # 关闭连接
    db.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

    执行事务

    • Python DB API 2.0 的事务提供了两个方法 commit 或 rollback
    # SQL删除记录语句
    sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
    try:
       # 执行SQL语句
       cursor.execute(sql)
       # 向数据库提交
       db.commit()
    except:
       # 发生错误时回滚
       db.rollback()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。

      • commit()方法提交当前游标所有更新操作,rollback()方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。
  • 相关阅读:
    文本生成系列之retrieval augmentation(进阶篇Atlas)
    【JVM】JVM表示浮点数
    Java集合
    BIO、NIO、AIO、多路复用IO
    2023届春招实习-个人面试过程和面经分享
    【MySQL基础】常用指令详解
    【计算机组成 课程笔记】7.2 DRAM和SRAM
    Linux下安装配置Python
    酪氨酸激酶、自噬等抗肿瘤抑制剂
    信息系统项目管理师必背核心考点(七十三)黑/白/灰盒测试
  • 原文地址:https://blog.csdn.net/qq877728715/article/details/132853653