zoukankan      html  css  js  c++  java
  • PyMySQL链接MySQL的一些事务操作

    1.在MySQL中创建数据库

    """创建mysql数据库"""
    import pymysql
    # 数据库连接引用类
    from pymysql.connections import Connection
    # 游标操作类
    from pymysql.cursors import Cursor
    
    
    # 通过pymysql的方法connect()方法声明一个MySQL连接对象conn。分别传入本地IP、用户名、密码、默认端口
    conn = pymysql.connect(host="localhost", user="root", password="yang123", port=3306)
    # <class 'pymysql.connections.Connection'>  生成连接对象Connection的实例
    print(type(conn))
    # 调用连接实例对象的cursor()方法获得MySQL的操作游标
    cursor = conn.cursor()
    # <class 'pymysql.cursors.Cursor'>   生成游标对象Cursor的实例
    print(type(cursor))
    # 调用游标实例对象的execute()方法执行sql语句,查看数据库版本
    cursor.execute("select version()")
    # 调用游标实例对象的fetchone()方法获得数据库版本的信息
    data = cursor.fetchone()
    # 打印数据库版本信息
    print("database version:", data)
    # 利用游标执行sql语句创建数据库并设置数据库编码utf8
    cursor.execute("create database demo default character set utf8")
    # 关闭连接
    conn.close()
    # 关闭游标
    cursor.close()
    View Code

    2.在数据库创建一张待操作表

    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    # 定义要执行的SQL语句
    sql = """
    CREATE TABLE USER1 (
    id INT auto_increment PRIMARY KEY ,
    name CHAR(10) NOT NULL UNIQUE,
    age TINYINT NOT NULL
    )ENGINE=innodb DEFAULT CHARSET=utf8;
    """
    # 执行SQL语句
    cursor.execute(sql)
    # 关闭光标对象
    cursor.close()
    # 关闭数据库连接
    conn.close()
    View Code
    # 导入pymysql模块(返回字典格式数据)
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句并且将结果作为字典返回的游标
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    # 定义要执行的SQL语句
    sql = """
    CREATE TABLE USER1 (
    id INT auto_increment PRIMARY KEY ,
    name CHAR(10) NOT NULL UNIQUE,
    age TINYINT NOT NULL
    )ENGINE=innodb DEFAULT CHARSET=utf8;
    """
    # 执行SQL语句
    cursor.execute(sql)
    # 关闭光标对象
    cursor.close()
    # 关闭数据库连接
    conn.close()
    View Code

    2.1扩展的创建数据库表方法

    """
    MySQL数据库中创建表
    """
    import pymysql
    
    
    # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
    db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
    # 调用连接实例对象的cursor()方法获得MySQL的操作游标
    cursor = db.cursor()
    # 编辑创建数据库表的sql语句
    sql = "create table if not exists students (id varchar(32) not null, name varchar(64) not null unique, age int not null, primary key (id))"
    # 到数据库执行编辑的sql语句
    cursor.execute(sql)
    # 关闭数据库连接
    db.close()
    # 关闭游标对象
    cursor.close()
    View Code

    3.向已创建的表中增加数据

    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
    username = "Alex"
    age = 18
    # 执行SQL语句
    cursor.execute(sql, [username, age])
    # 提交事务
    conn.commit()
    cursor.close()
    conn.close()
    View Code
    # 导入pymysql模块(在这里也可以加入事务回滚机制)
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
    username = "Alex"
    age = 18
    try:
        # 执行SQL语句
        cursor.execute(sql, [username, age])
        # 提交事务
        conn.commit()
    except Exception as e:
        # 有异常,回滚事务
        conn.rollback()
    cursor.close()
    conn.close()
    View Code
    # 导入pymysql模块(获取当前写入数据id,关联操作时会用到)
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
    username = "Alex"
    age = 18
    try:
        # 执行SQL语句
        cursor.execute(sql, [username, age])
        # 提交事务
        conn.commit()
        # 提交之后,获取刚插入的数据的ID
        last_id = cursor.lastrowid
    except Exception as e:
        # 有异常,回滚事务
        conn.rollback()
    cursor.close()
    conn.close()
    View Code
    # 导入pymysql模块(批量执行)
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"
    data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)]
    try:
        # 批量执行多条插入SQL语句
        cursor.executemany(sql, data)
        # 提交事务
        conn.commit()
    except Exception as e:
        # 有异常,回滚事务
        conn.rollback()
    cursor.close()
    conn.close()
    View Code

    3.1插入数据的通用方法

    """
    插入数据的通用方法
    事务的4个属性
    1.原子性:事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做
    2.一致性:事务必须使数据库从一个一致性状态表更到另一个一致性状态。一致性与原子性是密切相关的
    3.隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
    4.持久性:持久性也是永久性。指一个事务一旦提交,它对数据库中的数据改变就是永久性的。接下来的其他操作都不应该对其有任何影响
    """
    import pymysql
    
    # 待插入的数据
    data = {
    'id': '20190116',
    'name': 'xia',
    'age': 21
    }
    # 表名
    table = "students"
    # 构造动态待插入字段的字符串
    keys = ", ".join(data.keys())
    # 构造将要插入数据的动态字符串
    values = ", ".join(["%s"] * len(data))
    # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
    db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
    # 调用连接实例对象的cursor()方法获得MySQL的操作游标
    cursor = db.cursor()
    # 通用的sql语句插入方法,根据字典或者元组动态构造数据库插入语句
    sql = "INSERT INTO {table}({keys}) VALUES({values})".format(table=table, keys=keys, values=values)
    # 采用事务机制,保留操作的原子性。要么失败要么成功,不会出现数据的不完整情况
    try:
        # 传入待插入的数据
        if cursor.execute(sql, tuple(data.values())):
            print("成功提交")
        # 提交sql语句到数据库执行
            db.commit()
    except:
        # 发生异常事务回滚。相当于什么都没发生过
        db.rollback()
        print("提交失败")
    # 关闭连接
    db.close()
    # 关闭游标对象
    cursor.close()
    View Code

    4.删除表中的数据

    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    sql = "DELETE FROM USER1 WHERE id=%s;"
    try:
        cursor.execute(sql, [4])
        # 提交事务
        conn.commit()
    except Exception as e:
        # 有异常,回滚事务
        conn.rollback()
    cursor.close()
    conn.close()
    View Code

    4.1删除数据的通用方法

    """
    数据删除的通用方法
    """
    import pymysql
    
    
    # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
    db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
    # 调用连接实例对象的cursor()方法获得MySQL的操作游标
    cursor = db.cursor()
    # 表名称
    table = "students"
    # 删除条件。在这里可以有<、>、=、like、and、or等筛选条件
    condition = "age>24"
    # delete from students where age>24构造的sql语句
    sql = "delete from {table} where {condition}".format(table=table, condition=condition)
    try:
        # 传入待删除的数据
        cursor.execute(sql)
        # 正式提交sql语句
        db.commit()
    except:
        # 发生异常事务回滚。相当于什么都没发生过
        db.rollback()
    # 关闭数据库连接
    db.close()
    # 关闭游标对象
    cursor.close()
    View Code

    5.修改表中的数据

    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    # 修改数据的SQL语句
    sql = "UPDATE USER1 SET age=%s WHERE name=%s;"
    username = "Alex"
    age = 80
    try:
        # 执行SQL语句
        cursor.execute(sql, [age, username])
        # 提交事务
        conn.commit()
    except Exception as e:
        # 有异常,回滚事务
        conn.rollback()
    cursor.close()
    conn.close()
    View Code

    5.1数据更新的通用方法

    """数据更新的通用方法
    实现一种去重的方法,如果数据存在,则更新数据、如果数据不存在,则插入数据
    """
    import pymysql
    
    # 待更新的数据
    data = {
        "id": "20190112",
        "name": "yang",
        "age": 25
    }
    # 表名
    table = "students"
    # 构造动态待更新字段的字符串
    keys = ", ".join(data.keys())
    # 构造将要更新数据的动态字符串
    values = ", ".join(["%s"] * len(data))
    # 通用的sql语句更新方法,根据字典或者元组动态构造数据库更新语句
    sql = "insert into {table}({keys}) values({values}) on duplicate key update".format(table=table, keys=keys, values=values)
    # 构造需要更新的占位符键值对字符串
    # 'id=%s, name=%s, age=%s'
    update = ",".join([" {key}=%s".format(key=key) for key in data])
    # 拼接完整的数据库更新语句
    sql += update
    print(sql)
    # insert into students(id, name, age) values(%s, %s, %s) on duplicate key update id=%s, name=%s, age=%s
    # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
    db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
    # 调用连接实例对象的cursor()方法获得MySQL的操作游标
    cursor = db.cursor()
    try:
        # 传入待更新的数据,因为这个sql需要传入两处的占位符,第二个参数则乘以2
        if cursor.execute(sql, tuple(data.values())*2):
            print("提交成功")
            # 正式提交sql语句到数据库执行
            db.commit()
    except:
        print("提交失败")
        # 发生异常事务回滚。相当于什么都没发生过
        db.rollback()
    # 关闭数据库连接
    db.close()
    # 关闭游标对象
    cursor.close()
    View Code

    6.查看表中的数据

    # 导入pymysql模块
    import pymysql
    # 连接database
    conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
    # 得到一个可以执行SQL语句的光标对象
    cursor = conn.cursor()
    # 查询数据的SQL语句
    sql = "SELECT id,name,age from USER1 WHERE id=1;"
    # 执行SQL语句
    cursor.execute(sql)
    # 获取单条查询数据
    ret = cursor.fetchone()
    cursor.close()
    conn.close()
    # 打印下查询结果
    print(ret)
    View Code

    6.1查询数据的推荐方法

    """
    数据查询的通用方法
    """
    import pymysql
    
    
    # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
    db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
    # 调用连接实例对象的cursor()方法获得MySQL的操作游标
    cursor = db.cursor()
    # 将要查询的sql语句
    sql = "select * from students where age >= 21"
    try:
        # 传入待执行的sql语句
        cursor.execute(sql)
        # 打印查询的总数
        print("Count", cursor.rowcount)
        # 查到的第一个数据
        one = cursor.fetchone()
        # 元组的元素跟数据库中表的字段一一对应。第一个元素就是字段id等...
        print("One", one)
        """此方法一次查询所有的数据,如果数据很大占用的开销会很高
        # 因为已查询一个,偏移指针会从第二个开始查询之后所有的数据
        many = cursor.fetchall()
        # Many (('20190113', 'tang', 23), ('20190116', 'xia', 21))
        print("Many", many)
        # 元组包含元组的类型
        print("Many Type", type(many))
        for row in many:
            # 循环取值打印
            print(row)
        """
        # 推荐方法while循环取值
        while one:
            print("One", one)
            one = cursor.fetchone()
    except:
        print("Error")
    View Code

    7.扩展用法和注意事项

    # 可以获取指定数量的数据
    cursor.fetchmany(3)
    # 光标按绝对位置移动1
    cursor.scroll(1, mode="absolute")
    # 光标按照相对位置(当前位置)移动1
    cursor.scroll(1, mode="relative")
    
    SQL注入问题
        1. SQL语句在程序中是字符串,动态拼接的字符串,不要拿用户输入的内容去拼接字符串
        2. 不要自己拼接字符串
    View Code
  • 相关阅读:
    cpp学习
    7-2 求逆序对数目 (20分) 归并排序 O(nlogn)
    Egret 滚动背景图的实现
    Egret-我的疑问:Scroller如何禁止水平或垂直方向滚动
    Egret-我的探索:exml自定义组件中通过ID获取子组件实例
    Egret-我的疑问:自定义组件加载skin的操作
    Egret事件冒泡的应用
    Egret点击穿透(使遮盖可点击组件的其他组件禁止点击)
    Egret wing 4.1.6项目目录结构
    Egret分步加载资源改写loading界面
  • 原文地址:https://www.cnblogs.com/Guishuzhe/p/9820537.html
Copyright © 2011-2022 走看看