python操作mysql银行转账实例

版权声明:一起学习啊 https://blog.csdn.net/q1694222672/article/details/82587851

银行转账实例


1.连接数据库,并创建相关的表

import pymysql
conn = pymysql.connect(host='localhost',port=3306,user='root',passwd='root',db='qq')
cursor = conn.cursor()

#首先创建表,填入数据
#该数据库默认引擎为INNODB,支持事务
#sql = '''
#create table bank(
#id int not null primary key comment '账户ID',
#money int not null comment '账户余额'
#);
#'''
#cursor.execute(sql)

填入数据

这里写图片描述

2.操作逻辑

1)输入自己账户

2)输入对方账户

3)输入转账金额

4)SQL查询两个账户是否存在,

5)SQL查询自己账户的金额是否大于等于转账金额,

6)如果全部符合条件,则更新数据库,自己账户-转账金额,对方账户+转账金额

7)如果出现异常,则捕获异常并执行数据回滚

3.代码

# 账户A给账户B转账100元,该操作是要么成功,要么失败
'''
流程:
开始一个事务,检查账户AB是否可用,账户A是否有100,没问题的话,给B转100,提交事务
            若出现异常,则回滚操作
'''
import pymysql
conn = pymysql.connect(host='localhost',port=3306,user='root',passwd='root',db='qq')
cursor = conn.cursor()

#首先创建表,填入数据
#该数据库默认引擎为INNODB,支持事务
#sql = '''
#create table bank(
#id int not null primary key comment '账户ID',
#money int not null comment '账户余额'
#);
#'''
#cursor.execute(sql)

class TransferMoney():
    def __init__(self,conn,cursor,A,B,money):
        self.conn = conn
        self.cursor = cursor
        self.A = A
        self.B = B
        self.num = money
    def transfer(self):
        try:
            #检查AB账户余额并存入变量,如果账户不存在则会报错,进入except
            self.cursor.execute('select money from bank where id={}'.format(self.A))
            a = int(self.cursor.fetchone()[0])
            self.cursor.execute('select money from bank where id={}'.format(self.B))
            b = int(self.cursor.fetchone()[0])
            print(a,b)      #打印AB账户的金额,供测试用
            if a<self.num:
                print('余额不足,转账失败')      #若余额不足,属于正常执行,没有i,u,d语句,不用回滚
            else:
                #此为转账操作,将A的钱减去转账金额,B的钱加上转账金额
                #这里如果出错则进入except执行数据回滚
                #体现了事务的原子性,事务操作要么都做,要么都不做,如果其中一条语句错误,则全部回滚
                self.cursor.execute('update bank set money={} where id={}'.format(a-self.num,self.A))
                self.cursor.execute('update bank set money={} where id={}'.format(b + self.num, self.B))
                self.conn.commit()      #提交后数据库才会改变
                print('转账成功')
        except Exception as e:
            print('转账失败,事务回滚,请检查是否输入错误,放心,您的钱还在!')
            self.conn.rollback()

if __name__ == '__main__':
    A = int(input('请输入您的账户:'))
    B = int(input('请输入对方账户:'))
    money = int(input('请输入要转账的金额:'))

    tm = TransferMoney(conn,cursor,A,B,money)
    tm.transfer()

4.执行结果

开始时数据库
这里写图片描述

执行没有账户的操作
这里写图片描述

执行余额不足的操作
这里写图片描述

正确操作
这里写图片描述

过后数据库
这里写图片描述

演示完毕

猜你喜欢

转载自blog.csdn.net/q1694222672/article/details/82587851