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  结束


二、模拟银行转账系统代码


[python] view plaincopy
  1. #coding=utf-8  
  2. import sys  
  3. import MySQLdb  
  4.   
  5. ''''' 
  6. python操作MySQL数据库,模拟银行转账 
  7. '''  
  8.   
  9. class Trans_for_Money(object):  
  10.   
  11.     #初始化 类  
  12.     def __init__(self,conn):  
  13.         self.conn = conn  
  14.   
  15.     #### 1、检查所输入的账号是否存在 ####  
  16.     def check_acct_available(self,source_acctid):  
  17.   
  18.         #使用与数据库的链接并返回游标  
  19.         cursor=self.conn.cursor()  
  20.         try:  
  21.             #数据库命令  
  22.             sql="select * from tr_money where acctid=%s" %source_acctid  
  23.             #执行命令  
  24.             cursor.execute(sql)  
  25.             #为方便观察执行过程  
  26.             print "check_acct_available:" + sql  
  27.             #讲结果集放入变量result中,若result不等于1,则没有这个账号,输出异常  
  28.             result=cursor.fetchall()  
  29.             if len(result)!=1:  
  30.                 raise Exception("账号%s不存在" %source_acctid)  
  31.         finally:  
  32.             #若过程出现问题,仍需要关闭游标对象  
  33.             cursor.close()  
  34.   
  35.     #### 2、检查减款人余额是否充足,方法与上一个函数一样,只是多加了一个money参数 ###  
  36.     def has_enough_money(self,source_acctid,money):  
  37.   
  38.         cursor=self.conn.cursor()  
  39.         try:  
  40.             sql="select * from tr_money where acctid=%s and money>%s" %(source_acctid,money)  
  41.             cursor.execute(sql)  
  42.             print "has_enough_money:" + sql  
  43.             result=cursor.fetchall()  
  44.             if len(result)!=1:  
  45.                 raise Exception("账号%s余额不足" %source_acctid)  
  46.         finally:  
  47.             cursor.close()  
  48.   
  49.     #### 3、减款操作 ###  
  50.     def reduce_money(self,source_acctid,money):  
  51.   
  52.         cursor=self.conn.cursor()  
  53.         try:  
  54.             #数据库命令,减去对应减款人的金额数  
  55.             sql="update tr_money set money=money-%s where acctid=%s" %(money,source_acctid)  
  56.             cursor.execute(sql)  
  57.             print "reduce_money:" + sql  
  58.             #操作的execute()数据行数不等于1则减款失败  
  59.             if cursor.rowcount!=1:  
  60.                 raise Exception("账号%s减款失败" %source_acctid)  
  61.         finally:  
  62.             cursor.close()  
  63.   
  64.   
  65.     #### 4、收款操作,与减款方法相同 ###  
  66.     def add_money(self,target_acctid,money):  
  67.   
  68.         cursor=self.conn.cursor()  
  69.         try:  
  70.             sql="update tr_money set money=money+%s where acctid =%s" %(money,target_acctid)  
  71.             cursor.execute(sql)  
  72.             print "add_money:" + sql  
  73.   
  74.             if cursor.rowcount!=1:  
  75.                 raise Exception("账号%s收款失败" %target_acctid)  
  76.         finally:  
  77.             cursor.close()  
  78.   
  79.     #### 5、分别传入参数,代入上方函数,执行操作 ###  
  80.     def trans_for(self,source_acctid,target_acctid,money):  
  81.         try:  
  82.             self.check_acct_available(source_acctid)  
  83.             self.check_acct_available(target_acctid)  
  84.             self.has_enough_money(source_acctid,money)  
  85.             self.reduce_money(source_acctid,money)  
  86.             self.add_money(target_acctid,money)  
  87.             #提交当前事务  
  88.             self.conn.commit()  
  89.         except Exception as e:  
  90.             #若出错,回滚当前事务  
  91.             self.conn.rollback()  
  92.             raise e  
  93.   
  94.   
  95. if __name__=="__main__":  
  96.   
  97.     # source_acctid=sys.argv[1]  
  98.     # target_acctid=sys.argv[2]  
  99.     # money=sys.argv[3]  
  100.   
  101.     #建立与数据库的链接  
  102.     conn = MySQLdb.Connect(  
  103.                             host='127.0.0.1',  
  104.                             port=3306,  
  105.                             user='root',  
  106.                             passwd='12345678',  
  107.                             db='tt',  
  108.                             charset='utf8'  
  109.                           )  
  110.   
  111.     #手动输入减款人、收款人、转款数  
  112.     source_acctid=raw_input("请输入减款人: ")  
  113.     target_acctid=raw_input("请输入收款人: ")  
  114.     money=raw_input("请输入转款数: ")  
  115.   
  116.     #将参数传入类中  
  117.     tr_money=Trans_for_Money(conn)  
  118.     try:  
  119.         tr_money.trans_for(source_acctid,target_acctid,money)  
  120.     except Exception as e:  
  121.         print"出现问题:"+str(e)  
  122.     finally:  
  123.         conn.close()  
  124.         #关闭链接  

三、问题解决

[python] view plaincopy
  1.   

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 columnnameused 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 表执行后状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1007. 行相等的最少多米诺旋转

文章目录1. 题目2. 解题1. 题目 在一排多米诺骨牌中,A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分。(一个多米诺是两个从 1 到 6 的数字同列平铺形成的 —— 该平铺的每一半上都有一个数字。) 我们可以旋转第 i 张多米诺&a…

Hive内置函数大全

Hive内置函数大全 目录 Hive内置函数大全 1.复合类型构造函数 2 复合类型操作符 3 数值计算函数 4 日期函数 5 条件函数 6 字符串函数 7 汇总统计函数(UDAF) 8 表格生成函数(UDTF) 9 类型转换函数 10 数学函数 11 数学运算 12 逻辑运算 13…

python-mysql超简单银行转账

1首先先建数据库bank,数据结构表的名称为accoment: 2.python与mysql交互代码如下: # coding utf-8 # 1.导入模块 from pymysql import * import sys import pymysql# 2.接受命令行参数 if __name__ __main__:source_acctid 11target_acctid…

Linux Kernel ‘mp_get_count()’函数本地信息泄露漏洞

漏洞名称:Linux Kernel ‘mp_get_count()’函数本地信息泄露漏洞CNNVD编号:CNNVD-201311-054发布时间:2013-11-06更新时间:2013-11-06危害等级: 漏洞类型:信息泄露威胁类型:本地CVE编号&#x…

LeetCode 948. 令牌放置(贪心)

文章目录1. 题目2. 解题1. 题目 你的初始能量为 P,初始分数为 0,只有一包令牌。 令牌的值为 token[i],每个令牌最多只能使用一次,可能的两种使用方法如下: 如果你至少有 token[i] 点能量,可以将令牌置为…

Python 中操作 MySQL 步骤

1.引入模块 在py文件中引入pymysql模块 from pymysql import *2.Connection 对象 用于建立与数据库的连接 创建对象:调用connect()方法 connconnect(参数列表)参数host:连接的mysql主机,如果本机是localhost参数port:连接的m…

nacos配置中心配置已经常见错误总结

💻目录 前言1、基础架构2、依赖3、配置文件3.1、bolg-product配置文件3.1.1、application.yml配置文件3.1.2、bootstrap.yml配置文件3.1.3、nacos远程配置 3.2、bolg-system3.1.1、application.yml配置文件3.1.2、bootstrap.yml配置文件3.2.3、nacos远程配置 4、测试…

Hive解题思路

Hive解题思路 1 相关知识讲解 1.1 HQL语句的语法 sql语句的语法: select ..... from .... join ..... where .....group by ... having...order by|sort by|cluster by|distribute by .... (1)group by:按照某些字段的值进行…

tcl/tk demo

环境及版本说明: OSX10.9 tclsh -> tclsh8.5 wish -> wish8.5 查看本机运行环境: 1 which wish; 2 /usr/bin/wish 1 which tclsh; 2 /usr/bin/tclsh Demo功能说明: 用户登录窗口,输入用户名,密码.与文件中存储内容校验,如果相等,则提示"登录成功",否则提示&qu…

Hive高级操作

Hive高级操作 1 Hive的数据类型 1.1 原子数据类型 (1)Hive 是用 Java 开发的,Hive 里的基本数据类型和 java 的基本数据类型也是一一对应的, 除了 String 类型。 (2)有符号的整数类型:TINYIN…

05.序列模型 W2.自然语言处理与词嵌入(作业:词向量+Emoji表情生成)

文章目录作业1:1. 余弦相似度2. 单词类比3. 词向量纠偏3.1 消除对非性别词语的偏见3.2 性别词的均衡算法作业2:Emojify表情生成1. Baseline model: Emojifier-V11.1 数据集1.2 模型预览1.3 实现 Emojifier-V11.4 在训练集上测试2. Emojifier-V2: Using L…

LeetCode 688. “马”在棋盘上的概率(DP)

文章目录1. 题目2. 解题1. 题目 已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始。即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1)。 现有一个 “马”(也译作 “骑士”)位于 (r, c) ,并打算进行…

LeetCode 第 36 场双周赛(304/2204,前13.8%)

文章目录1. 比赛结果2. 题目1. LeetCode 5515. 设计停车系统 easy2. LeetCode 5516. 警告一小时内使用相同员工卡大于等于三次的人 medium3. LeetCode 5518. 给定行和列的和求可行矩阵 medium4. LeetCode 5517. 找到处理最多请求的服务器 hard1. 比赛结果 做出来3题&#xff0…

数据库实例:用户注册

1.根据结构创建表的脚本如下 createtable py_users( id int unsigned auto_increment not null primary key, uname varchar(20) not null, upwd char(40) not null, is_delete bit not null default 0 ); 如下流程图,接下来的代码就按照这个逻辑来写 2.创建user…

HBase原理

目录 HBase原理 1 HBase架构 2 HBase中的核心概念 3 HBase的存储机制 4 HBase的寻址机制 5 HBase的读写流程 6 HBase的设计 7 HBase和Hive的整合 HBase原理 1 HBase架构 HBase的架构为主从架构,HMaster为主节点,HRegionServer为从节点 &#x…

数据库实例:用户登录

如下遍流程图,接下来的代码就按照这个逻辑来写 创建user_login.py文件,代码如下 #codingutf-8 from MySQLdb import* from hashlib importsha1 if __name____main__: try: #接收输入用户名、密码 unameraw_input(请输入用户名&…

数据库实例:mysql与mongo结合用户登录

加入mongodb后登录逻辑如下图,将图中nosql的位置换为mongodb即可 用户数据存储的集合名称为py_users,文档格式为{uname:用户名,upwd:密码} 将原来MySQL操作的代码封装到一个方法中,代码如下 def mysql_login(): #mongodb中没有则到mysql中…

LeetCode 1609. 奇偶树(层序遍历)

文章目录1. 题目2. 解题1. 题目 如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 : 二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标为 2 ,依此类推。偶数下标 层上的所有节点的值都…

数据的特征工程

数据的特征工程 1 什么是数据的特征工程 特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。 特征工程的意义:将直接影响模型的预测结果。 2 数据的来源与类型 2.1 数据的来源 企业日益积累…

数据库实例:mysql与redis结合用户登录

加入redis后登录逻辑如下图,将图中nosql的位置换为redis即可 用户数据存的键为用户名,值为密码 将原来MySQL操作的代码封装到一个方法中,代码如下 defmysql_login(): #redis中没有则到mysql中查询 sqlselect upwd from py_users wher…