python操作数据库的过程:

创建连接—获取游标—执行命令—关闭游标—关闭连接

python访问mysql 要用pymysql库

pymysql需要安装:pip install pymysql

安装完之后导入pymysql,创建连接
连接数据库的参数按照实际情况添加,端口号默认是3306,我的有冲突,改成了3307

# 导入pymysqlimport 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()

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

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

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("数据库操作异常:\n", e)    finally:        # 不管成功还是失败,都要关闭数据库连接        conn.close()

添加多条数据

    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("数据库操作异常:\n", e)    finally:        # 不管成功还是失败,都要关闭数据库连接        conn.close()


表中可以看到已经插入成功

修改、更新数据
只需要修改添加的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("数据库操作异常:\n", e)    finally:        # 不管成功还是失败,都要关闭数据库连接        conn.close()


删除数据

    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("数据库操作异常:\n", e)    finally:        # 不管成功还是失败,都要关闭数据库连接        conn.close()

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

'''封装一个mysql工具类(需要自己写SQL语句)功能:mysql数据库操作步骤:    1.连接数据库    2.通过连接对象,获取游标对象    3.增删改查操作方法:    1.查    2.增删改 commit,rollback'''# 先要导入pymysqlimport 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("提交出错\n:", e)            # 如果出错要回滚            self.conn.rollback()    # 当对象被销毁时,游标要关闭,连接也要关闭    # 创建时是先创建连接后创建游标,关闭时是先关闭游标后关闭连接    def __del__(self):        self.cursor.close()        self.conn.close()

调用

# 已经封装好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("查询所有数据:\n", select_all)# 查询一条select_one = my_db.select_one(sql)print("查询一条数据:\n", select_one)# 查询多条select_many = my_db.select_many(sql, 3)print("查询3条数据:\n", 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)

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

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

import pymysqlclass Database():    # **config是指连接数据库时需要的参数,这样只要参数传入正确,连哪个数据库都可以    # 初始化时就连接数据库    def __init__(self, **config):        try:            # 连接数据库的参数我不希望别人可以动,所以设置私有            self.__conn = pymysql.connect(**config)            self.__cursor = self.__conn.cursor()        except Exception as e:            print("数据库连接失败:\n", 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("插入失败\n", 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("修改失败\n", 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("删除失败\n", e)            self.__conn.rollback()

引用 ↓

# 导包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")