源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-06-25 07:40 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:python操作MySQL 模拟简单银行转账操作
[b]一、基础知识[/b] [b]1、MySQL-python的安装[/b] 下载,然后 pip install 安装包 [b]2、python编写通用数据库程序的API规范[/b] (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相当于路上的运输车来传送命令与结果。                      [b]3、简单命令:[/b] select  查询数据:sql="select * from 表名 所查项目" insert  插入数据:sql=“insert into 表名  所插项目” update 更改数据: sql=“updata 表名 set  所改项目 ” delete 删除数据: sql=“delete from 表名 所删项目” where也是sql命令的关键存在,通常是  where 表头=列名 来定位那一列 [b]4、事务[/b] 访问和更新数据库的一个程序执行单元,所执行的命令,都可以称为事务 具有原子性,一致性,隔离性,持久性 事务执行:      conn.commit() 正常结束事务      conn.rollback() 异常结束事务,对事务进行回滚,若程序执行单元中的连续的操作在进行中出错,之前的操作还原。 简单操作过程:    开始 → 创建connection →获取cursor → 程序执行单元 → 关闭cursor → 关闭connection → 结束 [b]二、模拟银行转账系统代码[/b]
#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() 
  #关闭链接 
[b]三、问题解决[/b] 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 具体解释网址:[url=http://myhblog1989.blog.163.com/blog/static/183225376201110875818884/]http://myhblog1989.blog.163.com/blog/static/183225376201110875818884/[/url] 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 → 右键启动 [b]四、具体执行显示[/b] 1、数据库 tr_money 表的初始状态 [img]http://files.jb51.net/file_images/article/201709/2017092711185426.png[/img] 2、代码执行,输入减款人,收款人,转款数额 [img]http://files.jb51.net/file_images/article/201709/2017092711185427.png[/img] 3、执行,结果出现代码中特意 print 的操作进程显示 [img]http://files.jb51.net/file_images/article/201709/2017092711185428.png[/img] 4、数据库 tr_money 表执行后状态 [img]http://files.jb51.net/file_images/article/201709/2017092711185429.png[/img] [b]总结[/b] 以上所述是小编给大家介绍的python 操作mysql 模拟银行转账,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程素材网网站的支持!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部