• python操作mysql数据库


    python操作数据库的过程:

    创建连接—获取游标—执行命令—关闭游标—关闭连接
    在这里插入图片描述

    python访问mysql 要用pymysql库

    pymysql需要安装:pip install pymysql
    在这里插入图片描述
    安装完之后导入pymysql,创建连接
    连接数据库的参数按照实际情况添加,端口号默认是3306,我的有冲突,改成了3307

    # 导入pymysql
    import pymysql
    
    
    # 定义一个函数
    # 这个函数用来创建连接(连接数据库用)
    def mysql_db():
        # 连接数据库肯定需要一些参数
        conn = pymysql.connect(
            host="127.0.0.1",
            port=3307,
            database="lebo",
            charset="utf8",
            user="root",
            passwd="root"
        )
    
    
    if __name__ == '__main__':
        mysql_db()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    关于游标,执行SQL,查询数据
    游标需要创建游标还要关闭游标,为了防止忘关游标,所以用with

    # 打开数据库可能会有风险,所以添加异常捕捉
        try:
            with conn.cursor() as cursor:
                # 准备SQL语句
                sql = "select * from user"
                # 执行SQL语句
                cursor.execute(sql)
                # 执行完SQL语句后的返回结果都是保存在cursor中
                # 所以要从cursor中获取全部数据
                datas = cursor.fetchall()
                print("获取的数据:
    ", datas)
        except Exception as e:
            print("数据库操作异常:
    ", e)
        finally:
            # 不管成功还是失败,都要关闭数据库连接
            conn.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    cursor中获取数据的fetchall,fetchone,fetchmany

    fetchall:获取当前SQL语句能查出来的全部数据
    fetchone:每次获取一条数据。但是获取到这条数据后,指针会往后移一行数据
    在这里插入图片描述
    在这里插入图片描述
    fetchmany:直接告诉它想要多少条数据
    在这里插入图片描述
    插入一条数据
    重点一个是commit,一个是rollback。有提交的地方一定要有回滚。回滚到上次提交的地方

        try:
            with conn.cursor() as cursor:
                # 准备SQL语句
                value = "12,'鲁肃'"
                sql = f"insert into user values ({value});"
                # 执行SQL语句
                cursor.execute(sql)
                # 执行完要提交
                conn.commit()
                print("提交成功")
        except Exception as e:
            # 如果执行失败要回滚
            conn.rollback()
            print("数据库操作异常:
    ", e)
        finally:
            # 不管成功还是失败,都要关闭数据库连接
            conn.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    添加多条数据

        try:
            with conn.cursor() as cursor:
                # 准备要插入的数据
                # 插入一条
                # value = "12,'鲁肃'"
                # 插入多条
                value = "(13,'张三'),(14,'李四'),(15,'王五')"
                # 准备SQL语句
                sql = f"insert into user values {value};"
                # 执行SQL语句
                cursor.execute(sql)
                # 执行完要提交
                conn.commit()
                print("提交成功")
        except Exception as e:
            # 如果执行失败要回滚
            conn.rollback()
            print("数据库操作异常:
    ", e)
        finally:
            # 不管成功还是失败,都要关闭数据库连接
            conn.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述
    表中可以看到已经插入成功
    在这里插入图片描述
    修改、更新数据
    只需要修改添加的SQL语句,其他不变
    增删改查,除了查询,其他都需要提交

        try:
            with conn.cursor() as cursor:
    
                # 准备SQL语句
                sql = f"update user set name='封控了' where id = 1 ;"
                # 执行SQL语句
                cursor.execute(sql)
                # 执行完要提交
                conn.commit()
                print("提交成功")
        except Exception as e:
            # 如果执行失败要回滚
            conn.rollback()
            print("数据库操作异常:
    ", e)
        finally:
            # 不管成功还是失败,都要关闭数据库连接
            conn.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述
    删除数据

        try:
            with conn.cursor() as cursor:
    
                # 准备SQL语句
                sql = "delete from user where id = 12;"
                # 执行SQL语句
                cursor.execute(sql)
                # 执行完要提交
                conn.commit()
                print("删除成功")
        except Exception as e:
            # 如果执行失败要回滚
            conn.rollback()
            print("数据库操作异常:
    ", e)
        finally:
            # 不管成功还是失败,都要关闭数据库连接
            conn.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    封装一个需要自己写SQL语句的mysql工具类

    '''
    封装一个mysql工具类(需要自己写SQL语句)
    功能:mysql数据库操作
    步骤:
        1.连接数据库
        2.通过连接对象,获取游标对象
        3.增删改查操作
    方法:
        1.查
        2.增删改 commit,rollback
    '''
    
    # 先要导入pymysql
    import pymysql
    
    # 把连接参数定义成字典
    config = {
        "host": "127.0.0.1",
        "port": 3307,
        "database": "lebo",
        "charset": "utf8",
        "user": "root",
        "passwd": "root"
    }
    
    
    class Mysqldb():
        # 初始化方法
        def __init__(self):
            # 初始化方法中调用连接数据库的方法
            self.conn = self.get_conn()
            # 调用获取游标的方法
            self.cursor = self.get_cursor()
    
        # 连接数据库的方法
        def get_conn(self):
            # **config代表不定长参数
            conn = pymysql.connect(**config)
            return conn
    
        # 获取游标
        def get_cursor(self):
            cursor = self.conn.cursor()
            return cursor
    
        # 查询sql语句返回的所有数据
        def select_all(self, sql):
            self.cursor.execute(sql)
            return self.cursor.fetchall()
    
        # 查询sql语句返回的一条数据
        def select_one(self, sql):
            self.cursor.execute(sql)
            return self.cursor.fetchone()
    
        # 查询sql语句返回的几条数据
        def select_many(self, sql, num):
            self.cursor.execute(sql)
            return self.cursor.fetchmany(num)
    
        # 增删改除了SQL语句不一样其他都是一样的,都需要提交
        def commit_data(self, sql):
            try:
                # 执行语句
                self.cursor.execute(sql)
                # 提交
                self.conn.commit()
                print("提交成功")
            except Exception as e:
                print("提交出错
    :", e)
                # 如果出错要回滚
                self.conn.rollback()
    
        # 当对象被销毁时,游标要关闭,连接也要关闭
        # 创建时是先创建连接后创建游标,关闭时是先关闭游标后关闭连接
        def __del__(self):
            self.cursor.close()
            self.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
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    调用

    # 已经封装好mysql类了,就不用导入pymsql了,直接导入封装好的类
    
    from mysql_util import Mysqldb
    
    # 实例化
    my_db = Mysqldb()
    
    # 写查询SQL语句
    sql = "select * from user where id>5"
    # 查询所有
    select_all = my_db.select_all(sql)
    print("查询所有数据:
    ", select_all)
    # 查询一条
    select_one = my_db.select_one(sql)
    print("查询一条数据:
    ", select_one)
    # 查询多条
    select_many = my_db.select_many(sql, 3)
    print("查询3条数据:
    ", select_many)
    
    # 新增一条数据
    value = (16, 'BBQ')
    sql = f"insert into user values {value}"
    insert_one = my_db.commit_data(sql)
    # 新增多条数据
    values = "(17, 'aaa'), (18, 'bbb'), (19, 'ccc')"
    sql = f"insert into user values {values}"
    insert_many = my_db.commit_data(sql)
    
    # 修改数据
    sql = "update user set name = '出不去了' where id = 17"
    my_db.commit_data(sql)
    
    # 删除数据
    sql = "delete from user where id = 17"
    my_db.commit_data(sql)
    
    • 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
    • 34
    • 35
    • 36
    • 37
    • 38

    封装一个不用写SQL语句,只需要填参数的工具类

    只写了基本的增删改查,后面可以根据实际情况添加

    import pymysql
    
    
    class Database():
        # **config是指连接数据库时需要的参数,这样只要参数传入正确,连哪个数据库都可以
        # 初始化时就连接数据库
        def __init__(self, **config):
            try:
                # 连接数据库的参数我不希望别人可以动,所以设置私有
                self.__conn = pymysql.connect(**config)
                self.__cursor = self.__conn.cursor()
            except Exception as e:
                print("数据库连接失败:
    ", e)
    
        # 查询一条数据
        # 参数:表名table_name,条件factor_str,要查询的字段field 默认是查询所有字段*
        def select_one(self, table_name, factor_str='', field="*"):
            if factor_str == '':
                sql = f"select {field} from {table_name}"
            else:
                sql = f"select {field} from {table_name} where {factor_str}"
            self.__cursor.execute(sql)
            return self.__cursor.fetchone()
    
        # 查询多条数据
        # 参数:要查询数据的条数num,表名table_name,条件factor_str,要查询的字段field 默认是查询所有字段*
        def select_many(self, num, table_name, factor_str='', field="*"):
            if factor_str == '':
                sql = f"select {field} from {table_name}"
            else:
                sql = f"select {field} from {table_name} where {factor_str}"
            self.__cursor.execute(sql)
            return self.__cursor.fetchmany(num)
    
        # 查询全部数据
        # 参数:表名table_name,条件factor_str,要查询的字段field 默认是查询所有字段*
        def select_all(self, table_name, factor_str='', field="*"):
            if factor_str == '':
                sql = f"select {field} from {table_name}"
            else:
                sql = f"select {field} from {table_name} where {factor_str}"
            self.__cursor.execute(sql)
            return self.__cursor.fetchall()
    
        # 新增数据
        def insert(self,table_name, value):
            sql = f"insert into {table_name} values {value}"
            try:
                self.__cursor.execute(sql)
                self.__conn.commit()
                print("插入成功")
            except Exception as e:
                print("插入失败
    ", e)
                self.__conn.rollback()
    
        # 修改数据
        # 参数:表名,set值(可能是一个,也可能是多个,所以用字典),条件
        def update(self, table_name, val_obl,change_str):
            sql = f"update {table_name} set"
            # set后面应该是要修改的字段,但是可能会修改多个字段的值,所以遍历一下
            # key对应字段的名,val对应字段的值
            for key, val in val_obl.items():
                sql += f" {key} = {val},"
            # 遍历完的最后面会有一个逗号,所以给它切掉,然后再拼接条件
            # !!!空格很重要
            sql = sql[:-1]+" where "+change_str
            try:
                self.__cursor.execute(sql)
                self.__conn.commit()
                print("修改成功")
            except Exception as e:
                print("修改失败
    ", e)
                self.__conn.rollback()
    
        # 删除数据
        def delete(self,table_name, item):
            sql = f"delete from {table_name} where {item}"
            try:
                self.__cursor.execute(sql)
                self.__conn.commit()
                print("删除成功")
            except Exception as e:
                print("删除失败
    ", e)
                self.__conn.rollback()
    
    • 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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88

    引用 ↓

    # 导包
    from mysql_normal_util import Database
    
    # 设置连接数据库的参数
    config = {
        "host": "127.0.0.1",
        "port": 3307,
        "database": "lebo",
        "charset": "utf8",
        "user": "root",
        "passwd": "root"
    }
    
    # 实例化时就直接传参数
    db = Database(**config)
    
    # 查询1条
    select_one = db.select_one("user")
    print(select_one)
    
    # 查询多条
    select_many = db.select_many(3, "user")
    print(select_many)
    
    # 查询所有数据(根据条件)
    select_all = db.select_all("user", "id>10")
    print(select_all)
    
    # 新增一条数据
    db.insert("user","(20,'111')")
    # 新增多条数据
    db.insert("user", "(21,'123'),(22,'456')")
    
    # 修改一个字段的数据
    db.update("user", {"name": "222"}, "id=20")
    # 修改多个字段的数据
    db.update("user", {"id": "23", "name": "12345"}, "id=103")
    
    # 删除数据
    db.delete("user", "id=23")
    
    • 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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    【Leetcode】剑指Offer 04:二维数组中的查找
    化繁为简,国内知名期货交易所依托 MogDB 数据库促信创改造项目提速
    VScode远程root权限调试
    面试官:说一下MySQL事务隔离级别?
    五、vue组件与props自定义属性
    算法简述-串和串的匹配、排序、深度/广度优先搜索、动态规划、分治、贪心、回溯、分支限界
    Git精讲
    c语言练习:POJ 1003 宿醉(HangOver)
    【mmaction2 入门教程 04】训练 AVA 数据集中的自定义类别
    设计模式之状态模式
  • 原文地址:https://blog.csdn.net/m0_67402970/article/details/126113916