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


Posted in Python onSeptember 27, 2017

一、基础知识

1、MySQL-python的安装

下载,然后 pip install 安装包

2、python编写通用数据库程序的API规范

(1)、数据库连接对象 connection,建立python客户端与数据库的网络连接,创建方法为 MySQLdb.Connect(参数)

     参数有六个:     host(MySQL服务器地址,一般本地为127.0.0.1)

                            port(MySQL服务器端口号)
                            user(用户名)
                            passwd(密码)
                            db(数据库名称)
                            charset(连接编码)

     connection的方法: cursor()使用该连接并返回游标

                                      commit()提交当前事务
                                      rollback()回滚当前事务
                                      close()关闭连接

(2)、数据库游标对象cursor,用于执行查询和获取结果

    方法:execute(op[,args])执行一个数据库查询 和 命令

              fetchone()取得结果集的下一行
              fetchmany(size)获取结果集的下几行
              fetchall()获取结果集中剩下的所有行
              rowcount 最近一次execute返回数据的行数或影响行数
              close()关闭游标对象

connection与cursor:connection相当于python与MySQL之间的路,而cursor相当于路上的运输车来传送命令与结果。                     

3、简单命令:

select  查询数据:sql="select * from 表名 所查项目"
insert  插入数据:sql=“insert into 表名  所插项目”
update 更改数据: sql=“updata 表名 set  所改项目 ”
delete 删除数据: sql=“delete from 表名 所删项目”
where也是sql命令的关键存在,通常是  where 表头=列名 来定位那一列

4、事务

访问和更新数据库的一个程序执行单元,所执行的命令,都可以称为事务

具有原子性,一致性,隔离性,持久性

事务执行:

     conn.commit() 正常结束事务
     conn.rollback() 异常结束事务,对事务进行回滚,若程序执行单元中的连续的操作在进行中出错,之前的操作还原。

简单操作过程:    开始 → 创建connection →获取cursor → 程序执行单元 → 关闭cursor → 关闭connection → 结束

二、模拟银行转账系统代码

#coding=utf-8 
import sys 
import MySQLdb 
''''' 
python操作MySQL数据库,模拟银行转账 
''' 
class Trans_for_Money(object): 
 #初始化 类 
 def __init__(self,conn): 
  self.conn = conn 
 #### 1、检查所输入的账号是否存在 #### 
 def check_acct_available(self,source_acctid): 
  #使用与数据库的链接并返回游标 
  cursor=self.conn.cursor() 
  try: 
   #数据库命令 
   sql="select * from tr_money where acctid=%s" %source_acctid 
   #执行命令 
   cursor.execute(sql) 
   #为方便观察执行过程 
   print "check_acct_available:" + sql 
   #讲结果集放入变量result中,若result不等于1,则没有这个账号,输出异常 
   result=cursor.fetchall() 
   if len(result)!=1: 
    raise Exception("账号%s不存在" %source_acctid) 
  finally: 
   #若过程出现问题,仍需要关闭游标对象 
   cursor.close() 
 #### 2、检查减款人余额是否充足,方法与上一个函数一样,只是多加了一个money参数 ### 
 def has_enough_money(self,source_acctid,money): 
  cursor=self.conn.cursor() 
  try: 
   sql="select * from tr_money where acctid=%s and money>%s" %(source_acctid,money) 
   cursor.execute(sql) 
   print "has_enough_money:" + sql 
   result=cursor.fetchall() 
   if len(result)!=1: 
    raise Exception("账号%s余额不足" %source_acctid) 
  finally: 
   cursor.close() 
 #### 3、减款操作 ### 
 def reduce_money(self,source_acctid,money): 
  cursor=self.conn.cursor() 
  try: 
   #数据库命令,减去对应减款人的金额数 
   sql="update tr_money set money=money-%s where acctid=%s" %(money,source_acctid) 
   cursor.execute(sql) 
   print "reduce_money:" + sql 
   #操作的execute()数据行数不等于1则减款失败 
   if cursor.rowcount!=1: 
    raise Exception("账号%s减款失败" %source_acctid) 
  finally: 
   cursor.close() 
 #### 4、收款操作,与减款方法相同 ### 
 def add_money(self,target_acctid,money): 
  cursor=self.conn.cursor() 
  try: 
   sql="update tr_money set money=money+%s where acctid =%s" %(money,target_acctid) 
   cursor.execute(sql) 
   print "add_money:" + sql 
   if cursor.rowcount!=1: 
    raise Exception("账号%s收款失败" %target_acctid) 
  finally: 
   cursor.close() 
 #### 5、分别传入参数,代入上方函数,执行操作 ### 
 def trans_for(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='12345678', 
       db='tt', 
       charset='utf8' 
       ) 
 #手动输入减款人、收款人、转款数 
 source_acctid=raw_input("请输入减款人: ") 
 target_acctid=raw_input("请输入收款人: ") 
 money=raw_input("请输入转款数: ") 
 #将参数传入类中 
 tr_money=Trans_for_Money(conn) 
 try: 
  tr_money.trans_for(source_acctid,target_acctid,money) 
 except Exception as e: 
  print"出现问题:"+str(e) 
 finally: 
  conn.close() 
  #关闭链接

三、问题解决

1、sys.argv[ ] 

因为教学视频中用的IDE是MyEclipse,最后用run.Configuration 输入参数,而我用的是pycharm,表示笨的找不到还是其实它没有!

所以选择用raw_input() 在执行过程中输入参数

其实有去了解sys.argv[ ],但还是懂不太清楚。

2、  mysql_exceptions.IntegrityError: (1062, "Duplicate entry '7' for key 'PRIMARY'")

这个错误表示你所要插入的数据已经存在,最好去观察一下数据库的数据与自己的程序操作是否有矛盾

3、MySql 建表或输入数值时出错:1170-BLOB/TEXT column‘name'used in key specification without a key length

错误信息为BLOB或者TEXT字段使用了未指定键值长度的键

解决方法:设置其他为主键  或   将数据形式改为varchar

具体解释网址:http://myhblog1989.blog.163.com/blog/static/183225376201110875818884/

4、TypeError: 'post' is an invalid keyword argument for this function

错误原因:TypeError: “post”是这个函数的无效参数

这个问题错的很无语,一时脑子进水把 “port”=3306 写成了“post”=‘3306'

5、1054, "Unknown column 'acctid' in 'where clause'

错误原因:在where子句中找不到“acctid”列

呵呵,上个错误脑子进的水没排出来,把表头写错了…………

6、另外,还有一个错误是手动输入的减款,收款人设为字母或汉字时找不到

可能是我代码或数据库建表时的设定问题,表示在字符转换和数据库这方面还是小白一枚,继续奋斗吧!

7、MySQL数据库的启动

计算机 → 右键 → 管理 → 服务和应用程序 → 服务 → 找到MySQL → 右键启动

四、具体执行显示

1、数据库 tr_money 表的初始状态

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

2、代码执行,输入减款人,收款人,转款数额

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

3、执行,结果出现代码中特意 print 的操作进程显示

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

4、数据库 tr_money 表执行后状态

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

总结

以上所述是小编给大家介绍的python 操作mysql 模拟银行转账,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python中实现对list做减法操作介绍
Jan 09 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
python单例模式实例解析
Aug 28 Python
python实现ID3决策树算法
Aug 29 Python
Python检查ping终端的方法
Jan 26 Python
python使用socket 先读取长度,在读取报文内容示例
Sep 26 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
使用Python实现音频双通道分离
Dec 25 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 Python
python利用urllib和urllib2访问http的GET/POST详解
Sep 27 #Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 #Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 #Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 #Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 #Python
Python计算斗牛游戏概率算法实例分析
Sep 26 #Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 #Python
You might like
PHP Socket 编程
2010/04/09 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
如何使用Strace调试工具
2013/06/03 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
$.ajax json数据传递方法
2008/11/19 Javascript
javascript fullscreen全屏实现代码
2009/04/09 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
浅谈js闭包理解
2019/03/28 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
python 字典操作提取key,value的方法
2019/06/26 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
python实现登录与注册系统
2020/11/30 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
UNIX特点都有哪些
2016/04/05 面试题
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
学生会主席事迹材料
2014/01/28 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
Java面试题冲刺第十九天--数据库(4)
2021/08/07 Java/Android
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python