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()

关于游标,执行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
'''

# 先要导入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("提交出错\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 pymysql


class 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")

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年3月8日
下一篇 2023年3月8日

相关推荐