python操作MySQL 模拟简单银行转账操作

yizhihongxing

下面是完整攻略:

前言

在Python应用的常见开发场景中,与数据库的交互是非常常见的。而在数据库中,MySQL是应用最广泛的一种关系型数据库之一。因此,学习Python操作MySQL是非常必要的一种技能。

本文中,将介绍如何使用Python操作MySQL,模拟简单银行转账操作的完整攻略。在此操作中,将可以学习到如何使用Python与MySQL进行连接、创建、删除、更新、查询等操作。

SQL语句

在Python程序中操作MySQL,一个最基本的知识点就是SQL语句。SQL(Structured Query Language) 是一个用于管理关系型数据库系统的语言。它允许用户使用特定的语法编写操作数据库的指令。

在此处,我们将使用以下SQL语句实现银行转账操作:

-- 创建账户表
CREATE TABLE IF NOT EXISTS `accounts` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(64) NOT NULL,
    `balance` decimal(10,2) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

-- 插入账户信息
INSERT INTO accounts (name, balance) VALUES 
    ('Alice', 1000.00), 
    ('Bob', 2000.00),
    ('Charlie', 3000.00),
    ('David', 4000.00);

以上SQL语句的意思是,首先创建一个“accounts”表格,里面包含了id、name、balance三个字段,每个账户记录都包含了一个唯一的id、账户名字、和账户余额。然后,向accounts表中插入了4条记录,分别对应Alice、Bob、Charlie和David这4个账户,每个账户初始余额分别为1000、2000、3000和4000。

安装PyMySQL

在Python中操作MySQL需要用到PyMySQL模块,因此安装PyMySQL是必须的。使用以下命令来安装:

pip install pymysql

连接数据库

import pymysql

def connect():
    conn = pymysql.connect(
        host='localhost',
        user='root',
        password='password',
        db='bank',
        port=3306,
        charset='utf8mb4',
        cursorclass=pymysql.cursors.DictCursor
    )
    return conn

以上的代码实现了连接到MySQL数据库的功能。具体而言,connect()函数中,我们输入了MySQL数据库的主机名、用户名、密码、数据库名、端口号、字符编码和游标类型等参数。然后,用PyMySQL提供的connect()方法连接MySQL数据库,返回连接对象conn。

需要特别注意的是,为了支持中文等复杂字符集,我们使用了utf8mb4作为字符编码。

显示账户信息

def show_accounts():
    conn = connect()
    try:
        with conn.cursor() as cursor:
            sql = "SELECT * FROM accounts;"
            cursor.execute(sql)
            result = cursor.fetchall()
            for row in result:
                print("id=%d, name=%s, balance=%.2f" % (
                    row['id'], row['name'], row['balance']))
    finally:
        conn.close()

以上代码会显示accounts表中的所有记录,包括每个账户的id、账户名和账户余额。

在这里我们使用了fetchall()函数,它在一次操作中获取所有结果集中的记录。而 with ... as ...: 语句与 finally: 语句组合使用,会保证连接在执行完毕后关闭。

转账操作

def transfer(from_name, to_name, amount):
    conn = connect()
    try:
        with conn.cursor() as cursor:
            # 开启事务
            conn.begin()
            # 读取转账人信息
            from_sql = "SELECT * FROM accounts WHERE name=%s;"
            cursor.execute(from_sql, (from_name,))
            from_account = cursor.fetchone()
            # 读取收款人信息
            to_sql = "SELECT * FROM accounts WHERE name=%s;"
            cursor.execute(to_sql, (to_name,))
            to_account = cursor.fetchone()
            # 如果转账人和收款人都存在
            if from_account and to_account:
                # 如果余额足够
                if from_account['balance'] >= amount:
                    # 更新转账人余额
                    from_balance = from_account['balance'] - amount
                    from_update_sql = "UPDATE accounts SET balance=%s WHERE id=%s;"
                    cursor.execute(from_update_sql, (from_balance, from_account['id']))
                    # 更新收款人余额
                    to_balance = to_account['balance'] + amount
                    to_update_sql = "UPDATE accounts SET balance=%s WHERE id=%s;"
                    cursor.execute(to_update_sql, (to_balance, to_account['id']))
                    # 提交事务
                    conn.commit()
                    print("Transfer %s from [%s] to [%s] succeed!" % (amount, from_name, to_name))
                else:
                    print("[%s] balance not enough to transfer %d" % (from_name, amount))
            else:
                print("From account [%s] or To account [%s] not exist!" % (from_name, to_name))
    finally:
        conn.close()

以上代码实现了银行转账的操作。在此处,我们使用了SELECT和UPDATE操作。

SELECT操作用于查询数据库中的记录集,而UPDATE操作则用于更新数据库中的记录集。事务开启后,先通过查询出转账人和收款人的账户信息,然后从转账余额中减去相应的转账数目,再将余额加入到收款人的账户中,最后提交事务。

需要注意的是,转账操作可能失败,因此我们在代码中使用了try-finally语句,确保连接在程序执行完毕后关闭。

示例

以下是模拟简单银行转账操作的两个示例:

示例1:Alice向Bob转账100元

transfer('Alice', 'Bob', 100)

输出结果:

Transfer 100 from [Alice] to [Bob] succeed!

示例2:Bob向Carl转账500元,但是Bob只有300元

transfer('Bob', 'Carl', 500)

输出结果:

[Bob] balance not enough to transfer 500

以上就是对“Python操作MySQL 模拟简单银行转账操作”的完整攻略了。希望通过这篇文章,您可以了解到如何使用Python与MySQL进行连接、创建、删除、更新、查询等操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python操作MySQL 模拟简单银行转账操作 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySql报错Table mysql.plugin doesn’t exist的解决方法

    针对“MySql报错Table mysql.plugin doesn’t exist的解决方法”的问题,下面是一些解决方法: 问题描述 MySQL客户端报错Table mysql.plugin doesn’t exist,这个问题通常是因为MySQL数据库实例升级或者版本兼容性问题导致的。 解决方法1:使用mysql_install_db初始化MySQL m…

    database 2023年5月18日
    00
  • Java面试题冲刺第二天–Redis篇

    下面我将针对Java面试题冲刺第二天–Redis篇的完整攻略进行讲解。 Redis的基本概念 什么是Redis Redis是一个高性能的Key-Value类型的NoSQL数据库,它通常用作缓存、消息队列、排行榜等。Redis支持数据保存到内存中,并可以异步地保存修改到磁盘上,同时还能把修改操作记录到日志中。 Redis的数据类型 Redis支持多种数据类型…

    database 2023年5月22日
    00
  • redis集群搭建以及在SpringBoot中的配置

    redis的安装:https://www.cnblogs.com/knightdreams6/p/11270400.html 集群搭建: 两台虚拟机模拟6个节点,一台机器3个节点,创建3 master, 3 salve 环境 redis采用 redis-5.0.5版本。 两台虚拟机都是CentOS7,一台ip(192.168.3.222),另一台(192.1…

    Redis 2023年4月11日
    00
  • mysql数据插入覆盖和时间戳的问题及解决

    我们来详细讲解如何解决mysql数据插入覆盖和时间戳问题。 问题描述 在使用mysql存储数据时,会遇到两个常见问题: 数据插入时会覆盖掉原有数据; 数据的时间戳不准确或者不是当前时间。 问题分析 问题1:数据插入覆盖 数据插入时覆盖掉原有数据的原因通常是因为主键冲突,或者在插入数据时忘记设置主键而导致出现重复数据。 问题2:数据时间戳不准确 数据的时间戳通…

    database 2023年5月22日
    00
  • Python对数据库操作

    Python对数据库操作的完整攻略 概述 Python作为一门广泛应用于数据处理领域的编程语言,对于数据库操作的支持也是早已被广泛开发和应用的。通过Python能够方便地进行各类数据库管理,如连接数据库、查询数据、修改数据等。本文将带领读者深入了解Python对数据库操作的完整攻略,供读者参考。 数据库连接 Python涉及到常用的数据库连接有以下几种方式:…

    database 2023年5月22日
    00
  • thinkPHP简单实现多个子查询语句的方法

    实现多个子查询语句的方法主要涉及到ThinkPHP的链式操作和查询构造器的使用。下面是具体的攻略步骤: 1. 使用链式操作 ThinkPHP的链式操作能够方便地实现多个子查询语句的嵌套,操作步骤如下: 首先使用查询构造器构造一个子查询对象$subQuery1,并设置需要查询的字段和查询条件。 $subQuery1 = Db::table(‘table1’) …

    database 2023年5月22日
    00
  • MySQL中连接查询和子查询的问题

    MySQL中连接查询(JOIN)和子查询(Subquery)都是常用的查询方式,但两者在实现以及性能上有所差异。下面我们来分别介绍这两种查询方式的用法和特点。 连接查询 连接查询是通过在FROM子句中使用JOIN关键字,指定多个表之间的关联关系,从而查询出符合条件的数据的。连接查询分为内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RI…

    database 2023年5月22日
    00
  • Mongodb在CSharp里实现Aggregate实例

    下面是实现MongoDB的Aggregate操作的完整攻略: 1. 前置条件 在进行Aggregate操作之前需要确保以下条件已满足:1. .NET Core环境已经配置好,并安装并引入MongoDB驱动程序包。2. 确认MongoDB已经安装并已运行。 2. Aggregation Pipeline Aggregate操作是MongoDB提供的强大功能之一…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部