使用 Python 实现 MySQL 数据库的 CRUD 操作并记录日志

数据库 MySQL
在开发基于数据库的应用程序时,对数据库进行增删改查(CRUD)操作是必不可少的一部分。Python 作为一门流行的编程语言,提供了多种方式与 MySQL 数据库交互。

引言

在开发基于数据库的应用程序时,对数据库进行增删改查(CRUD)操作是必不可少的一部分。Python 作为一门流行的编程语言,提供了多种方式与 MySQL 数据库交互。本文将向您展示如何通过 .ini 文件存储 SQL 查询,并使用 Python 的 mysql-connector-python 库来执行这些查询。此外,我们还会集成日志功能,确保所有 SQL 操作都被记录下来,便于后续审查和故障排除。

准备工作

首先,确保您的环境中已经安装了 mysql-connector-python 和 configparser 模块。可以通过 pip 安装:

pip install mysql-connector-python

创建配置文件

我们将创建两个 .ini 文件来分别存放数据库连接信息和 SQL 查询语句。

db_config.ini - 数据库连接信息

[mysql]
host=localhost
user=root
passwd=password
database=testdb

sql_queries.ini - SQL 查询语句

[Queries]
create_employee = INSERT INTO employees (name, position, office, salary) VALUES (%s, %s, %s, %s)
read_employees = SELECT * FROM employees
update_employee_salary = UPDATE employees SET salary = %s WHERE id = %s
delete_employee = DELETE FROM employees WHERE id = %s

封装数据库操作

接下来,我们将创建一个名为 database_manager.py 的 Python 脚本,用以管理数据库连接、读取 SQL 查询并执行 CRUD 操作。同时,我们会添加日志记录功能,确保每次 SQL 操作都被记录到指定的日志文件中。

import configparser
import mysql.connector
from mysql.connector import Error
import logging
# 设置日志配置
logging.basicConfig(filename='database_operations.log', level=logging.INFO,
                    format='%(asctime)s - %(levelname)s - %(message)s')
class DatabaseManager:
    def __init__(self, config_file='db_config.ini', sql_file='sql_queries.ini'):
        self.config = configparser.ConfigParser()
        self.sql_queries = configparser.ConfigParser()
        self.config.read(config_file)
        self.sql_queries.read(sql_file)
        self.connection = None
    def create_connection(self):
        """创建数据库连接"""
        try:
            self.connection = mysql.connector.connect(
                host=self.config.get('mysql', 'host'),
                user=self.config.get('mysql', 'user'),
                passwd=self.config.get('mysql', 'passwd'),
                database=self.config.get('mysql', 'database')
            )
            print("连接到 MySQL 数据库成功")
            logging.info("连接到 MySQL 数据库成功")
        except Error as e:
            print(f"发生错误 '{e}'")
            logging.error(f"发生错误 '{e}'")
    def close_connection(self):
        """关闭数据库连接"""
        if self.connection:
            self.connection.close()
            print("数据库连接已关闭")
            logging.info("数据库连接已关闭")
    def execute_query(self, query_name, data=None):
        """执行 SQL 查询并记录日志"""
        cursor = self.connection.cursor()
        try:
            query = self.sql_queries.get('Queries', query_name)
            logging.info(f"执行 SQL: {query} | 数据: {data}")
            if data:
                cursor.execute(query, data)
            else:
                cursor.execute(query)
            self.connection.commit()
            print("查询执行成功")
            logging.info("查询执行成功")
        except Error as e:
            print(f"发生错误 '{e}'")
            logging.error(f"发生错误 '{e}'")
        finally:
            cursor.close()
    def fetch_data(self, query_name):
        """获取数据并记录日志"""
        cursor = self.connection.cursor(dictinotallow=True)
        try:
            query = self.sql_queries.get('Queries', query_name)
            logging.info(f"执行 SQL: {query}")
            cursor.execute(query)
            result = cursor.fetchall()
            return result
        except Error as e:
            print(f"发生错误 '{e}'")
            logging.error(f"发生错误 '{e}'")
        finally:
            cursor.close()
# 示例用法:
if __name__ == "__main__":
    db_manager = DatabaseManager()
    db_manager.create_connection()
    # 插入新员工记录
    employee_data = ('John Doe', 'Developer', 'London', 123000)
    db_manager.execute_query('create_employee', employee_data)
    # 读取所有员工信息
    employees = db_manager.fetch_data('read_employees')
    for employee in employees:
        print(employee)
    # 更新员工薪资
    new_salary = (150000, 1)
    db_manager.execute_query('update_employee_salary', new_salary)
    # 删除员工记录
    employee_id = (1,)
    db_manager.execute_query('delete_employee', employee_id)
    db_manager.close_connection()

日志配置解释

filename='database_operations.log':指定了日志输出文件的位置。

level=logging.INFO:设置了日志级别为 INFO,意味着所有 INFO 级别及以上的消息(如 WARNING, ERROR)都会被记录。

format='%(asctime)s - %(levelname)s - %(message)s':定义了日志的格式,包括时间戳、日志级别和消息内容。

总结

通过以上步骤,我们可以轻松地使用 Python 来实现 MySQL 数据库的 CRUD 操作,并且所有的 SQL 操作都会被详细地记录下来。这种方式不仅简化了代码结构,还提高了应用程序的可维护性和安全性。希望这篇文章能够帮助您更好地理解和应用 Python 进行数据库操作!

Q: 如果我使用的是不同的数据库,这段代码还能用吗?

A: 是的,但您需要根据所使用的数据库类型调整连接字符串和可能的 SQL 语法。例如,如果您使用的是 PostgreSQL 或 SQLite,您应该安装相应的 Python 驱动程序,并修改连接设置。

Q: 如何处理大型项目中的多个配置文件?

A: 对于大型项目,可以考虑使用环境变量或专用的配置管理系统来管理不同环境下的配置信息。这可以帮助避免敏感信息硬编码在源代码中,并提高部署灵活性。

希望这篇微信公众号文章能够满足您的需求,清晰地展示了如何使用 Python 实现 MySQL 数据库的 CRUD 操作,并结合日志记录功能确保操作透明度。

责任编辑:华轩 来源: 测试开发学习交流
相关推荐

2016-11-03 18:54:06

Java数据库

2011-08-04 13:31:50

数据库记录更改日志触发器

2019-01-02 09:30:59

MySQL数据库日志审计

2010-05-28 10:48:52

MySQL数据库

2009-06-04 15:59:53

Netbeans操作MMySQL数据库

2010-06-01 17:45:57

MySQL数据库

2010-07-07 17:05:39

SQL Server数

2021-08-02 09:01:29

PythonMySQL 数据库

2017-11-27 11:41:06

python数据库数据分析

2011-05-24 09:32:38

2024-03-25 07:22:50

GolangMySQL数据库

2009-03-10 09:38:02

oraclepython数据库

2024-09-29 16:11:55

NLogSQL数据库

2018-09-11 17:13:23

MySQ数据库重复记录

2010-05-28 14:51:47

MySQL数据库

2021-08-02 10:53:28

PythonMySQL数据库

2022-09-01 23:29:22

MySQLPython数据库

2010-06-02 16:57:50

MySQL数据库同步

2011-07-11 14:36:10

BinlogMysql

2010-06-01 13:58:24

远程连接MySQL
点赞
收藏

51CTO技术栈公众号