MST

星途 面试题库

面试题:SQLite核心API事务控制与错误处理

用Python结合SQLite核心API,实现一个银行转账的功能。假设有两张表accounts(包含account_id, balance字段),分别表示账户信息。从一个账户向另一个账户转账一定金额,要求使用事务确保数据的一致性,并在操作过程中正确处理可能出现的各种SQLite错误,如数据库锁定、SQL语句错误等,给出完整代码示例。
43.6万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试
import sqlite3


def transfer_money(from_account_id, to_account_id, amount):
    try:
        # 连接到SQLite数据库
        conn = sqlite3.connect('bank.db')
        cursor = conn.cursor()

        # 开始事务
        conn.execute('BEGIN')

        # 查询转出账户余额
        cursor.execute('SELECT balance FROM accounts WHERE account_id =?', (from_account_id,))
        from_balance = cursor.fetchone()
        if from_balance is None:
            raise ValueError(f"转出账户 {from_account_id} 不存在")
        from_balance = from_balance[0]

        # 检查转出账户余额是否足够
        if from_balance < amount:
            raise ValueError(f"转出账户 {from_account_id} 余额不足")

        # 更新转出账户余额
        new_from_balance = from_balance - amount
        cursor.execute('UPDATE accounts SET balance =? WHERE account_id =?', (new_from_balance, from_account_id))

        # 查询转入账户余额
        cursor.execute('SELECT balance FROM accounts WHERE account_id =?', (to_account_id,))
        to_balance = cursor.fetchone()
        if to_balance is None:
            raise ValueError(f"转入账户 {to_account_id} 不存在")
        to_balance = to_balance[0]

        # 更新转入账户余额
        new_to_balance = to_balance + amount
        cursor.execute('UPDATE accounts SET balance =? WHERE account_id =?', (new_to_balance, to_account_id))

        # 提交事务
        conn.execute('COMMIT')

        print(f"从账户 {from_account_id} 成功转账 {amount} 到账户 {to_account_id}")

    except sqlite3.Error as e:
        # 回滚事务
        conn.execute('ROLLBACK')
        print(f"SQLite错误: {e}")
    except ValueError as ve:
        # 回滚事务
        conn.execute('ROLLBACK')
        print(f"业务错误: {ve}")
    finally:
        # 关闭数据库连接
        if conn:
            conn.close()


# 示例调用
transfer_money(1, 2, 100)

上述代码实现了银行转账功能,在转账过程中使用事务确保数据一致性,同时处理了账户不存在、余额不足以及SQLite本身可能出现的错误。transfer_money 函数接受三个参数:转出账户ID (from_account_id)、转入账户ID (to_account_id) 和转账金额 (amount)。在函数内部,通过SQLite核心API完成转账操作,并在出现错误时回滚事务以保证数据一致性。