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实现批量检测HTTP服务的状态
Oct 27 Python
一个基于flask的web应用诞生(1)
Apr 11 Python
pandas按若干个列的组合条件筛选数据的方法
Apr 11 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
Python OpenCV读取png图像转成jpg图像存储的方法
Oct 28 Python
Pyinstaller打包.py生成.exe的方法和报错总结
Apr 02 Python
pandas删除指定行详解
Apr 04 Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 Python
使用sublime text3搭建Python编辑环境的实现
Jan 12 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 Python
Python语法学习之进程的创建与常用方法详解
Apr 08 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缓存技术详细总结
2013/08/07 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
PHP编写RESTful接口
2016/02/23 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
js实现网站首页图片滚动显示
2013/02/04 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
Python封装shell命令实例分析
2015/05/05 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
python对于requests的封装方法详解
2019/01/03 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
浅析Python3 pip换源问题
2020/01/06 Python
keras中的History对象用法
2020/06/19 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
法人委托书范本
2014/04/04 职场文书
雷锋之歌观后感
2015/06/10 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技