最近都在学习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. Challenge Create a Launch Pad

    在头文件中定义网格体组件和重叠组件 UPROPERTY(VisibleAnywhere,Category="Components") UStaticMeshComponent* M ...

  2. CSS 模块的侦测

    CSS 的规格发展太快,新的模块层出不穷.不同浏览器的不同版本,对 CSS 模块的支持情况都不一样.有时候,需要知道当前浏览器是否支持某个模块,这就叫做“CSS模块的侦测”. 一个比较普遍适用的方法是 ...

  3. Linux 如何通过命令查看一个文件的某几行(中间几行或最后几行)

    linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1 ...

  4. C++11 override 和 final 关键字

    C++11之前,一直没有继承控制关键字.禁用一个类的进一步衍生是可能的但也很棘手.为避免用户在派生类中重载一个虚函数,你不得不向后考虑. C++ 11添加了两个继承控制关键字:override和fin ...

  5. linux syscall 详解【转】

    转自:https://blog.csdn.net/feixin620/article/details/78416560 引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及ap ...

  6. requests支持socks5代理了

    记录下 以前: import socket import socks from requests_html import HTMLSession session=HTMLSession() socks ...

  7. axios请求接口的踩坑之路

    1.跨域问题除了前端安装插件还需要后端php设置,设置如下 Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, ...

  8. HTTP协议06-报文首部

    HTTP报文格式 ​ HTTP协议的请求和响应报文中必定包含HTTP首部.首部内容为客户端和服务器分别处理请求和响应提供所需要的信息. 1)HTTP请求报文 在请求中,HTTP报文由方法.URI.HT ...

  9. 设计模式C++学习笔记之十八(Visitor访问者模式)

      18.1.解释 概念:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. main(),客户 IVisitor,访问者接口 CBaseVis ...

  10. 题解-CodeForces835F Roads in the Kingdom

    Problem CodeForces-835F 题意:求基环树删去环上任意一边后直径最小值,直径定义为所有点对最近距离的最大值 Solution 首先明确删去环上一点是不会影响树内直径的,所以应当先把 ...