最近都在学习Python代码,希望学会Python后,能给我带来更高的工作效率,所以每天坚持学习和拷代码,下面是一个Python操作MySQL的一个实例,该实例可以让更多的人更好了解MySQLdb模块的使用。我是Python菜鸟,通过学习别人的实例来让自己学到更多Python知识。

案例:用Python实现银行转账

一、在MySQL创建一张表account表,然后在里面插入两条数据:

mysql> show create table account\G
*************************** 1. row ***************************
Table: account
Create Table: CREATE TABLE `account` (
`userid` int(11) DEFAULT NULL COMMENT '账号ID',
`money` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.02 sec) mysql>

当前数据:

mysql> select * from account;
+--------+-------+
| userid | money |
+--------+-------+
| 1 | 200 |
| 2 | 200 |
+--------+-------+
2 rows in set (0.00 sec) mysql>

编辑脚本money.py文件,运行些脚本需要安装MySQLdb模块,详细安装和基本的使用可以参考我的博客:http://www.cnblogs.com/xuanzhi201111/p/5144982.html

#!/usr/bin/env python
#coding:utf-8
#name:money.py import sys
import MySQLdb class TransferMoney(object):
def __init__(self,conn):
self.conn = conn #用于检查是否存在转账用户或者被转账用户
def check_user_exist(self, userid):
cursor = self.conn.cursor()
try:
sql = "select * from account where userid = %s" % userid
cursor.execute(sql)
print "\033[;32m验证用户是否存在: \033[0m" + sql
except Exception,e:
raise Exception('执行sql错误:%s' % e)
else:
rs = cursor.fetchall()
if len(rs) != 1:
raise Exception ("账号%s不存在" % userid)
finally:
cursor.close() #用于检查是用户是否有足够的钱转给别人
def has_enough_money(self,source_userid,money):
cursor = self.conn.cursor()
try:
sql = "select * from account where userid = %s and money > %s" % (source_userid,money)
cursor.execute(sql)
print "\033[;32m检查是否有足够的钱: \033[0m" + sql
except Exception,e:
raise Exception('执行sql错误:%s' % e)
else:
rs = cursor.fetchall()
if len(rs) != 1:
raise Exception ("账号%s余额不足" % source_userid)
finally:
cursor.close() #用于减去转掉的部份金额
def reduce_money(self,source_userid,money):
cursor = self.conn.cursor()
try:
sql = "update account set money = money - %s where userid=%s" % (money,source_userid)
cursor.execute(sql)
print "\033[;32m从源账户%s里扣掉对应的金额: \033[0m" % (source_userid) + sql
except Exception,e:
raise Exception('执行sql错误:%s' % e)
else:
rs = cursor.rowcount
if rs!=1:
raise Exception("账号%s减款失败" % source_userid)
finally:
cursor.close() #用于把别人转过来的钱加到目标用户的金额上
def add_money(self,target_userid,money):
cursor=self.conn.cursor()
try:
sql="update account set money = money + %s where userid=%s" % (money,target_userid)
cursor.execute(sql)
print '\033[;32m目标账户%s加上转过来的金额:\033[0m' % (target_userid) + sql
except Exception,e:
raise Exception('执行sql错误:%s' % e)
else:
rs=cursor.rowcount
if rs!=1:
raise Exception("账号%s加钱失败" % target_userid)
finally:
cursor.close() #用于转账后的查询账号的金额
def check_money(self,source_userid):
cursor=self.conn.cursor()
try:
sql="select * from account where userid=%s" % (source_userid)
cursor.execute(sql)
except Exception,e:
raise Exception('执行sql错误:%s' % e)
else:
rs = cursor.fetchall()
for row in rs:
print "userid=%d, 现在的金额=%d" % row
finally:
cursor.close() #主函数,调用以上的函数形成一个事务
def transfer(self, source_userid, target_userid, money):
try:
self.check_user_exist(source_userid)
self.check_user_exist(target_userid)
self.has_enough_money(source_userid,money)
self.reduce_money(source_userid,money)
self.add_money(target_userid,money)
self.conn.commit()
self.check_money(source_userid)
self.check_money(target_userid)
except Exception as e:
self.conn.rollback()
raise e if __name__ == '__main__':
source_userid = sys.argv[1]
target_userid = sys.argv[2]
money = sys.argv[3] conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',port=3306,db='python')
tr_money = TransferMoney(conn) try:
tr_money.transfer(source_userid,target_userid,money)
except Exception as e:
print "\033[;31m出现问题:\033[0m" + str(e)
finally:
conn.close()

代码验证:

从账号1 转账100块给账号 2:

[root@Python test]# python money.py  1 2 100
验证用户是否存在: select * from account where userid = 1
验证用户是否存在: select * from account where userid = 2
检查是否有足够的钱: select * from account where userid = 1 and money > 100
从源账户1里扣掉对应的金额: update account set money = money - 100 where userid=1
目标账户2加上转过来的金额:update account set money = money + 100 where userid=2
userid=1, 现在的金额=100
userid=2, 现在的金额=300

从账号 1 转500给账号 2,会出现余额不足

[root@Python test]# python money.py  1 2 500
验证用户是否存在: select * from account where userid = 1
验证用户是否存在: select * from account where userid = 2
检查是否有足够的钱: select * from account where userid = 1 and money > 500
出现问题:账号1余额不足

从账号 2 转账200块给账号 1

[root@Python test]# python money.py  2 1 200
验证用户是否存在: select * from account where userid = 2
验证用户是否存在: select * from account where userid = 1
检查是否有足够的钱: select * from account where userid = 2 and money > 200
从源账户2里扣掉对应的金额: update account set money = money - 200 where userid=2
目标账户1加上转过来的金额:update account set money = money + 200 where userid=1
userid=2, 现在的金额=100
userid=1, 现在的金额=300

可以看到正常的转账了,初学Python,还有很多需要优化的地方,希望大家指出我的不足,让我更好更快的成长,同时也希望大家一起把Python学好

参考资料:

http://www.imooc.com/

作者:陆炫志

出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

Python操作MySQL案例的更多相关文章

  1. python操作mysql——mysql.connector

    连接mysql, 需要mysql connector, conntector是一种驱动程序,python连接mysql的驱动程序,mysql官方给出的名称为connector/python, 可参考m ...

  2. 数据备份 及 Python 操作 Mysql

    一 MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如Windows. #2. 逻辑备份: 备份的是建表.建库.插入等操作所执行SQL语句,适用 ...

  3. python操作MySQL、事务、SQL注入问题

    python操作MySQL python中支持操作MySQl的模块很多 其中最常见就是'pymysql' # 属于第三方模块 pip3 install pymysql # 基本使用 import py ...

  4. python操作MySQL,SQL注入的问题,SQL语句补充,视图触发器存储过程,事务,流程控制,函数

    python操作MySQL 使用过程: 引用API模块 获取与数据库的连接 执行sql语句与存储过程 关闭数据库连接 由于能操作MySQL的模块是第三方模块,我们需要pip安装. pip3 insta ...

  5. python操作MySQL与MySQL补充

    目录 python操作MySQL 基本使用 SQL注入问题 二次确认 视图 触发器 事务 存储过程 函数 流程控制 索引 练习 python操作MySQL python中支持操作MySQL的模块很多, ...

  6. Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy

    本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...

  7. 练习:python 操作Mysql 实现登录验证 用户权限管理

    python 操作Mysql 实现登录验证 用户权限管理

  8. Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  9. Python操作Mysql之基本操作

    pymysql python操作mysql依赖pymysql这个模块 下载安装 pip3 install pymysql 操作mysql python操作mysql的时候,是通过”游标”来进行操作的. ...

随机推荐

  1. dubbo源码分析4——SPI机制_ExtensionFactory类的作用

    ExtensionFactory的源码: @SPI public interface ExtensionFactory { /** * Get extension. * * @param type o ...

  2. Flash硬件原理

    1.2.1. 什么是Flash Flash全名叫做Flash Memory,从名字就能看出,是种数据存储设备,存储设备有很多类,Flash属于非易失性存储设备(Non-volatile Memory ...

  3. Spring MVC全局异常处理

    继承HandlerExceptionResolver接口实现自己的处理方法,如: public class MyHandlerExceptionResolver implements HandlerE ...

  4. 在TOMCAT下配置工程的默认访问设置(转)

    对工程的部署一般是将工程的压缩文件放在tomcat安装目录的webapps下,访问时通过键入:http://localhost:8080/xx(假定为本机访问,xx是部署时的应用工程的访问名字). 而 ...

  5. zabbix3.2监控vcenter和exsi信息

    简介 为了解 ESXI虚拟主机的运行状况,通过zabbix进行监控,图形展示ESXI虚拟主机当前的状态,避免因为esxi服务器因为资源利用率过高导致 概述 从 Zabbix 2.2.0 开始支持对 V ...

  6. NodeJS+Express+MySQL开发小记(2):服务器部署

    http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/ NodeJS+Express+MySQL开发小记(1)里讲过 ...

  7. FTP登录提示Can't open data connection for transfer of "/"

    服务器: 系统:windows server 2008 R2 standard 是否开启防火墙:是 FTP客户端:Filezilla server 本地: FTP服务端:winscp 使用winscp ...

  8. SQL Server代码段

    1.cast和convert ' as int) -- 123 ') -- 123 select CAST(123.4 as int) -- 123 select CONVERT(int, 123.4 ...

  9. MinGW-w64非官方编译器集成安装包(很清楚)

    官方链接[编辑] MinGW 官方网站. SourceForge.net上的MinGW官方的下载站点(Win32系统). MinGW-w64官方的下载站点[编辑] MinGW-w64是2005年由On ...

  10. select下拉框插件jquery.editable-select

    项目中有个需求,下拉框既可以下拉选择,也可以手动填写 html代码 <span>数据来源</span> </select> js代码 $('#noMean').ed ...