PyODBC:让Python与数据库握手的魔法师!

青青直言 2024-10-31 18:51:09

今天要带大家认识一个特别实用的Python库 —— PyODBC。它就像是一座桥梁,可以让Python程序轻松地和各种数据库(比如SQL Server、MySQL、Access等)进行沟通。无论是读取数据、更新记录,还是执行复杂的数据库操作,PyODBC都能帮我们轻松搞定!1. 初识PyODBC

首先,让我们来安装PyODBC:

# 在命令行执行pip install pyodbc

小贴士:在安装PyODBC之前,请确保你的电脑上已经安装了相应数据库的驱动程序哦!

2. 建立数据库连接

让我们先来看看如何连接到一个SQL Server数据库:

import pyodbcdef create_connection():    # 连接参数    server = 'localhost'      database = 'TestDB'    username = 'sa'    password = 'your_password'        # 建立连接字符串    conn_str = f'''        DRIVER={{SQL Server}};        SERVER={server};        DATABASE={database};        UID={username};        PWD={password}    '''        try:        # 创建连接        conn = pyodbc.connect(conn_str)        print("连接成功!")        return conn    except pyodbc.Error as e:        print(f"连接失败:{str(e)}")        return None# 测试连接connection = create_connection()

3. 基本数据库操作

来看看如何进行基本的增删改查操作:

def basic_database_operations(conn):    # 创建游标    cursor = conn.cursor()        # 创建表    cursor.execute('''        CREATE TABLE IF NOT EXISTS employees (            id INT PRIMARY KEY,            name VARCHAR(50),            salary DECIMAL(10,2)        )    ''')        # 插入数据    cursor.execute('''        INSERT INTO employees (id, name, salary)        VALUES (?, ?, ?)    ''', (1, '小青', 5000.00))        # 查询数据    cursor.execute('SELECT * FROM employees')    for row in cursor:        print(f"ID: {row.id}, 姓名: {row.name}, 工资: {row.salary}")        # 提交更改    conn.commit()    cursor.close()

小贴士:记得在操作完成后调用commit()来保存更改,用完后关闭游标和连接!

4. 批量操作和参数化查询

处理大量数据时,使用批量操作可以提高效率:

def batch_operations(conn):    cursor = conn.cursor()        # 准备批量插入的数据    employees = [        (2, '小明', 6000.00),        (3, '小红', 6500.00),        (4, '小华', 7000.00)    ]        # 批量插入    cursor.executemany('''        INSERT INTO employees (id, name, salary)        VALUES (?, ?, ?)    ''', employees)        # 使用参数化查询    min_salary = 6000.00    cursor.execute('''        SELECT * FROM employees         WHERE salary >= ?    ''', min_salary)        results = cursor.fetchall()    for row in results:        print(f"{row.name}的工资是{row.salary}")        conn.commit()    cursor.close()

5. 异常处理和事务管理

在实际应用中,proper错误处理很重要:

def safe_database_operation(conn):    cursor = conn.cursor()        try:        # 开始事务        cursor.execute("BEGIN TRANSACTION")                # 执行一系列操作        cursor.execute('''            UPDATE employees             SET salary = salary * 1.1             WHERE salary < ?        ''', (6000.00,))                # 检查是否有足够的预算        cursor.execute('SELECT SUM(salary) as total FROM employees')        total_salary = cursor.fetchone().total                if total_salary > 30000:            # 如果总工资超出预算,回滚            raise Exception("超出预算!")                    # 提交事务        conn.commit()        print("加薪成功!")            except Exception as e:        # 发生错误时回滚        conn.rollback()        print(f"操作失败:{str(e)}")            finally:        cursor.close()

6. 实用技巧

这里有一些实用的进阶操作:

def advanced_tips(conn):    cursor = conn.cursor()        # 获取表结构信息    cursor.columns('employees')    for column in cursor:        print(f"列名:{column.column_name}, 类型:{column.type_name}")        # 使用with语句自动管理连接    with conn.cursor() as cur:        cur.execute("SELECT COUNT(*) FROM employees")        count = cur.fetchval()  # 获取单个值        print(f"总员工数:{count}")        # 获取查询结果为字典形式    cursor.execute("SELECT * FROM employees")    columns = [column[0] for column in cursor.description]    results = [dict(zip(columns, row)) for row in cursor.fetchall()]    print(results)

练习题:

尝试编写一个函数,可以根据部门名称查询该部门的平均工资实现一个简单的员工管理系统,包含增加、删除、修改、查询功能

小贴士:

在正式环境中,千万不要在代码里硬编码数据库密码大量数据操作时,建议使用批量操作而不是循环单条插入记得及时关闭数据库连接,避免资源泄露使用参数化查询可以防止SQL注入攻击

今天的Python学习之旅就到这里啦!记得动手敲代码。祝大家学习愉快,Python学习节节高!

0 阅读:0

青青直言

简介:欢迎大家关注我,给我点赞!