python配置MySQL(下)
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账号是否存在;
检查金额是否满足;
加金额;
减金额;
查看数据库:
原表:
刷新后,转账成功: