python配置MySQL(下)python银行转账实例

python银行转账实例

基于慕课网疯狂的蚂蚁crazyant讲师学习python MYSQL操作,实例运行成功。
代码流程:
在这里插入图片描述
创建表:
1、语句执行(出错)
在这里插入图片描述
2、可视化操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(引擎设置为InnoDB, 不能设为MYISAM。因为MYISAM不支持事务操作,导致事务无法回滚,导致数据库转账金额出现错误的情况)

代码编写过程自顶向下,从抽象到具体
(pycharm快捷键:Alt+Enter ;eclipse快捷键: Ctrl+1)可选中函数实现自动创建类、方法
在 PyCharm 中设置相关的运行参数:账户A的ID,账户B的ID,转账金额
【Run】⇒ 【Edit Configurations】⇒ 【parameters】
在这里插入图片描述
执行代码:
(注意事项:拼写错误要留意,否则会报错)

# -*- coding:utf-8 -*-
# __author__ = 'yang'
#1、编写脚本执行入口
import sys
import MySQLdb
#创建类的构造函数conn;实现transfer方法编写转账操作
#实现转账操作函数:(正常转账成功则提交事务,否则回滚事务,异常重新抛出)
#1.创建数据库连接
#2.检测两个账号ID是否可用:获取cursor;创建sql语句;执行sql并打印结果用于调试;把查询的结果集放在变量rs;判断rs长度不为1,则账户不存在
#3.检查付款人是否有足够的钱
#4.付款人减金额: if cursor.rowcount != 1:表示该语句影响了数据库多少行数据
#5.收款人加相应金额
class TransferMeney(object):
    def __init__(self, conn):
        self.conn = conn
    def check_acct_available(self, acctid):
        cursor = self.conn.cursor()
        try:
            sql = "select * from account where acctid=%s"%acctid
            cursor.execute(sql)
            print "check_acct_available:"+sql
            rs = cursor.fetchall()
            if len(rs)!=1:
                raise Exception("账户%s不存在"%acctid)
        finally:
            cursor.close()

    def has_enough_money(self, acctid, money):
        cursor = self.conn.cursor()
        try:
            sql = "select * from account where acctid=%s and money>%s" % (acctid,money)
            cursor.execute(sql)
            print "has_enough_money:" + sql
            rs = cursor.fetchall()
            if len(rs) != 1:
                raise Exception("账号%s没有足够的钱" % acctid)
        finally:
            cursor.close()

    def reduce_money(self, acctid, money):
        cursor = self.conn.cursor()
        try:
            sql = "update account set money=money-%s where acctid=%s" % (money, acctid)
            cursor.execute(sql)
            print "reduce_money:" + sql
            if cursor.rowcount != 1:
                raise Exception("账号%s减款失败" % acctid)
        finally:
            cursor.close()

    def add_money(self, acctid, money):
        cursor = self.conn.cursor()
        try:
            sql = "update account set money=money+%s where acctid=%s" % (money, acctid)
            cursor.execute(sql)
            print "add_money:" + sql
            if cursor.rowcount != 1:
                raise Exception("账号%s加款失败" % acctid)
        finally:
            cursor.close()

    def Transfer(self,source_acctid, target_acctid, money):
        try:
            self.check_acct_available(source_acctid)
            self.check_acct_available(target_acctid)
            self.has_enough_money(source_acctid, money)
            self.reduce_money(source_acctid, money)
            self.add_money(target_acctid, money)
            self.conn.commit()
        except Exception as e:
            self.conn.rollback()
            raise e

if __name__=="__main__":
    source_acctid = sys.argv[1]
    target_acctid = sys.argv[2]
    money = sys.argv[3]

    conn = MySQLdb.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='imooc', charset='utf8')
    tr_money = TransferMeney(conn)

    try:
        tr_money.Transfer(source_acctid, target_acctid, money)
    except Exception as e:
        print "出现问题:" + str(e)


#1、运用if语句,接收三个参数,分别是付款人账户ID、收款人账户ID、转账金额
#2、创建数据库连接,将数据库传入对象;创建一个对象,进行转账操作。使用一个类TransferMeney()来实现整个逻辑
#3、进行转账操作:传入三个参数(若出现异常,将错误打印;最后关闭整个流程);

运行结果:
检查11账号是否存在;
检查12账号是否存在;
检查金额是否满足;
加金额;
减金额;
在这里插入图片描述
查看数据库:
原表:
在这里插入图片描述
刷新后,转账成功:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值