银行转账demo
思路:
- 首先要有一个表,存储转账人id和钱数,收款人的id和钱数。建表参考文章末尾创建数据表,并插入数据的代码。
- 验证两人是否存在,验证出款热年钱数是否大于转账钱数,最后一人出款,一人收款。
- 因此代码分为两大部分,主函数和类。类里边又包含各操作方法,和所有方法的调用执行。
知识点:
- python 操作数据库,要安装一个Python和数据库交互的包MySQL-python,然后我们就可以使用MySQLdb这个包进行数据库操作了。
- cursor() – 获取操作游标
- execute(self, nameid, money) – 执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
- fetchall() – 返回查询到的所有记录
- rollback() – 回滚当前游标的所有操作,即当做什么也没发生
- 关闭数据库连接 , 需要分别的关闭指针对象和连接对象.
cursor.close() 、conn.close() - 在执行完插入或删除或修改操作后,需要调用一下conn.commit()方法进行提交.这样,数据才会真正保存在数据库中.
#!/usr/bin/python
# Filename:three.py
import sys
import MySQLdb
#类
class hq(object):
def __init__(self,conn):
self.conn = conn
#验证两人是否存在
def cunzai(self,nameid):
cursor = self.conn.cursor()
try:
sql="select * from account where nameid=%s" %nameid
cursor.execute(sql)
print "cunzai:" + sql
rs = cursor.fetchall()
if len(rs) !=1:
raise Exception("%s bucunzai" % nameid)
finally:
cursor.close()
#验证出款人钱够不够
def enough_money(self,nameid,money):
cursor = self.conn.cursor()
try:
sql = "select * from account where nameid=%s and money>%s" % (nameid,money)
cursor.execute(sql)
print "enough_money:" + sql
rs = cursor.fetchall()
if len(rs) !=1:
raise Exception("%s not have enough money" % nameid)
finally:
cursor.close()
#减钱
def reduce_money(self,nameid,money):
cursor = self.conn.cursor()
try:
sql = "update account set money=money-%s where nameid= %s " % (money,nameid)
cursor.execute(sql)
print "reduce_money:" +sql
if cursor.rowcount !=1:
raise Exception("%s reduce money fail" % nameid)
finally:
cursor.close()
#加钱
def add_money(self,nameid,money):
cursor = self.conn.cursor()
try:
sql = "update account set money=money+%s where nameid= %s " % (money,nameid)
cursor.execute(sql)
print "add money:" + sql
if cursor.rowcount !=1:
raise Exception("%s add money fail" % nameid)
finally:
cursor.close()
#触发所有
def transfer(self,source_acctid,target_acctid,money):
try:
self.cunzai(source_nameid)
self.cunzai(target_nameid)
self.enough_money(source_nameid,money)
self.reduce_money(source_nameid,money)
self.add_money(target_nameid,money)
self.conn.commit()
except Exception as e:
self.conn.rollback()
raise e
#如果出现异常,就回滚当前游标的所有操作,并抛出异常
#主函数
if __name__ == "__main__":
conn = MySQLdb.Connect(
host = 'localhost',
port = 3306,
user = 'root',
passwd = '',
db = 'mytest',
charset = 'utf8'
)
source_nameid = sys.argv[1]
target_nameid = sys.argv[2]
money = sys.argv[3]
#从命令行中获取三个参数分别作为出款人,收款人,转账金额
tr_money = hq(conn)
try:
tr_money.transfer(source_nameid,target_nameid,money)
except Exception as e:
print "yichang" , str(e)
finally:
conn.close()
命令行代码如下(例如该文件名称为test . py):
$ python test.py 1 2 100
#1给2转账100
创建数据表,并插入数据
#连接数据库
conn = MySQLdb.Connect(
host = 'localhost',
port = 3306,
user = 'root',
passwd = '',
db = 'mytest',
charset = 'utf8'
)
cursor = conn.cursor()
#创建一个表存储数据
sql_create = "create table if not exists account(nameid int, money varchar(100)) "
#插入两条数据
sql_insert1 = "insert into account(nameid,money) values(13,120)"
sql_insert2 = "insert into account(nameid,money) values(14,10)"
#执行上述sql语句
cursor.execute(sql_create)
cursor.execute(sql_insert1)
cursor.execute(sql_insert2)
conn.close()
参考慕课网python教程
如果您有什么问题或建议,欢迎留言…^.^