这篇文章主要介绍了python操作MySQL 模拟简单银行转账操作,需要的朋友可以参考下
一、基础知识
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 表的初始状态
2、代码执行,输入减款人,收款人,转款数额
3、执行,结果出现代码中特意 print 的操作进程显示
4、数据库 tr_money 表执行后状态
总结
以上是python操作MySQL模拟银行转账操作的简单实例的详细内容。更多信息请关注PHP中文网其他相关文章!

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver CS6
视觉化网页开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。