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基础教程之Hello World!
Aug 29 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
python中星号变量的几种特殊用法
Sep 07 Python
Python实现购物车程序
Apr 16 Python
python 脚本生成随机 字母 + 数字密码功能
May 26 Python
如何用Python合并lmdb文件
Jul 02 Python
Python代码太长换行的实现
Jul 05 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
Django中使用Json返回数据的实现方法
Jun 03 Python
Python简单实现词云图代码及步骤解析
Jun 04 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 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源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
9个JavaScript评级/投票插件
2010/01/18 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
js 通过cookie实现刷新不变化树形菜单
2014/10/30 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
最简单的tab切换实例代码
2016/05/13 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
2017/04/25 Javascript
详解vue.js之绑定class和style的示例代码
2017/08/24 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
python实现的jpg格式图片修复代码
2015/04/21 Python
python Django模板的使用方法
2016/01/14 Python
Python类装饰器实现方法详解
2018/12/21 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
python怎么提高计算速度
2020/06/11 Python
意大利网上药房:Farmacia 33
2020/01/27 全球购物
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
JS原生实现轮播图的几种方法
2021/03/23 Javascript
市场营销职业生涯规划书范文
2014/01/12 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
社区包粽子活动方案
2014/01/21 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
工程质量月活动方案
2014/02/19 职场文书
遗失说明具结保证书
2015/02/26 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
导游词书写之黄山
2019/08/06 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python