062. 编写一个函数,实现简单的数据库连接和操作

在 Python 中,可以使用多种数据库连接库来实现与不同数据库的连接和操作。以下是一个通用的示例,展示如何编写一个简单的函数来连接数据库并执行基本操作(如查询和插入)。

示例 1:使用 SQLite

SQLite 是一个轻量级的嵌入式数据库,适合小型项目或测试用途。Python 自带了 sqlite3 模块,可以直接使用。

示例代码

import sqlite3

def sqlite_db_operations(db_path, query, params=None):
    """
    执行 SQLite 数据库操作

    :param db_path: 数据库文件路径
    :param query: SQL 查询语句
    :param params: 查询参数(可选),用于防止 SQL 注入
    :return: 查询结果(如果是 SELECT 查询)
    """
    try:
        # 连接到 SQLite 数据库
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()

        # 执行 SQL 查询
        if params:
            cursor.execute(query, params)
        else:
            cursor.execute(query)

        # 如果是 SELECT 查询,返回结果
        if query.strip().upper().startswith("SELECT"):
            result = cursor.fetchall()
            return result
        else:
            # 对于其他操作(如 INSERT、UPDATE、DELETE),提交事务
            conn.commit()
            return cursor.rowcount  # 返回影响的行数

    except sqlite3.Error as e:
        print(f"数据库操作失败:{e}")
        return None
    finally:
        # 关闭连接
        if conn:
            conn.close()

# 示例用法
if __name__ == "__main__":
    db_path = "example.db"  # 数据库文件路径

    # 创建表
    create_table_query = """
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER NOT NULL
    )
    """
    sqlite_db_operations(db_path, create_table_query)

    # 插入数据
    insert_query = "INSERT INTO users (name, age) VALUES (?, ?)"
    insert_params = ("Alice", 30)
    sqlite_db_operations(db_path, insert_query, insert_params)

    # 查询数据
    select_query = "SELECT * FROM users"
    result = sqlite_db_operations(db_path, select_query)
    print("查询结果:", result)

示例 2:使用 MySQL

MySQL 是一个广泛使用的开源关系型数据库。Python 可以通过 mysql-connector-pythonpymysql 等库来连接 MySQL 数据库。这里我们使用 mysql-connector-python

示例代码

import mysql.connector

def mysql_db_operations(config, query, params=None):
    """
    执行 MySQL 数据库操作

    :param config: 数据库连接配置
    :param query: SQL 查询语句
    :param params: 查询参数(可选),用于防止 SQL 注入
    :return: 查询结果(如果是 SELECT 查询)
    """
    try:
        # 连接到 MySQL 数据库
        conn = mysql.connector.connect(**config)
        cursor = conn.cursor()

        # 执行 SQL 查询
        if params:
            cursor.execute(query, params)
        else:
            cursor.execute(query)

        # 如果是 SELECT 查询,返回结果
        if query.strip().upper().startswith("SELECT"):
            result = cursor.fetchall()
            return result
        else:
            # 对于其他操作(如 INSERT、UPDATE、DELETE),提交事务
            conn.commit()
            return cursor.rowcount  # 返回影响的行数

    except mysql.connector.Error as e:
        print(f"数据库操作失败:{e}")
        return None
    finally:
        # 关闭连接
        if conn:
            conn.close()

# 示例用法
if __name__ == "__main__":
    # 数据库连接配置
    config = {
        "host": "localhost",
        "user": "root",
        "password": "password",
        "database": "example_db"
    }

    # 创建表
    create_table_query = """
    CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(50) NOT NULL,
        age INT NOT NULL
    )
    """
    mysql_db_operations(config, create_table_query)

    # 插入数据
    insert_query = "INSERT INTO users (name, age) VALUES (%s, %s)"
    insert_params = ("Alice", 30)
    mysql_db_operations(config, insert_query, insert_params)

    # 查询数据
    select_query = "SELECT * FROM users"
    result = mysql_db_operations(config, select_query)
    print("查询结果:", result)

代码说明

连接数据库

  • 对于 SQLite,使用 sqlite3.connect() 连接到数据库文件。

  • 对于 MySQL,使用 mysql.connector.connect() 连接到数据库服务器。

执行 SQL 查询

  • 使用 cursor.execute() 执行 SQL 查询。

  • 如果查询需要参数(如插入数据时),可以将参数作为第二个参数传入,以防止 SQL 注入。

处理查询结果

  • 如果是 SELECT 查询,使用 cursor.fetchall() 获取查询结果。

  • 如果是 INSERTUPDATEDELETE 查询,提交事务并返回影响的行数。

异常处理:捕获数据库操作中可能出现的异常,并打印错误信息。

关闭连接:在 finally 块中关闭数据库连接,确保资源被正确释放。

注意事项

安装依赖库:如果使用 MySQL,需要安装 mysql-connector-python 库:

pip install mysql-connector-python

数据库配置:根据你的数据库服务器配置,修改 config 字典中的 hostuserpassworddatabase 参数。

安全性:在实际应用中,建议不要在代码中直接写明数据库密码,可以使用环境变量或配置文件来存储敏感信息。

事务处理:对于修改数据的操作(如 INSERTUPDATEDELETE),需要调用 conn.commit() 提交事务。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)