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

时间: 2024-10-14 06:24:37

python操作MySQL 模拟简单银行转账操作的相关文章

mysql模块简单实用操作-----nodejs

1 //mysql模块简单实用操作 2 3 var mysql = require('mysql'); 4 5 mc = {}; 6 7 8 var dbconfig = { 9 host : 'xxxxxxxxxx', 10 user : 'xxx', 11 password : 'xxx', 12 database : 'xxxxx' 13 }; 14 15 16 17 mc.sqlExc = function (sql, next) { 18 var db = mysql.createCo

php类模块引擎PDO操作MySQL数据库简单阐述

PDO是什么呢? 通俗说就是别人写的一个“数据库操作工具类”,它非常强大,可以应对市面上几乎所有主流数据库, 具体应用时候有这样一个关系: 即,要操作某种数据,就得去“打开”对应的pdo引擎. 在php.ini的配置文件中,无非就是一个“模块”而已,我们只需要把分号删掉就表示开启!如下: 改为: 使用pdo连接mysql数据库 $dsn = "mysql:host=服务器地址/名称:port=端口号:dbname=数据库名"; $opt = array(PDO::MYSQL_ATTR_

python下selenium模拟浏览器基础操作

1.安装及下载 selenium安装: pip install selenium  即可自动安装selenium geckodriver下载:https://github.com/mozilla/geckodriver/releases Chromedriver下载:http://npm.taobao.org/mirrors/chromedriver/ 2.保存路径 将下载好的geckodriver以及Chromedriver解压到桌面,打开我的电脑,找到Python文件夹中anancode文件

cmd 下 对MySQL进行简单的操作

首先,点击windows+R,搜索CMD,打开 之后进入cmd.exe,在命令行输入MySQL -u root -p;点击回车 不过我在测试的时候出现以下的错误信息, 不过不要急,再次windows+R,搜索 service.msc,打开找到MySQL服务,关闭服务,并重新开启 再次在CMD的命令行进行输入MySQL -u root -p 接下来,查看MySQL面的databases:同样是输入命令,show databases:(一定要在命令结束的时候加:) 在接下来,命令行输入,use te

php对mysql数据库简单连接操作

前些阵子忙完了公司前端静态页面的事情了之后,简单学习了下php的基础知识,今天想了想回顾一下php连接数据库的方式,写一下随笔存一下看看 php连接数据库端口和新建数据库 <?php $servername = "localhost"; $username = "root"; // 创建连接 $conn = mysqli_connect($servername, $username); // 检测连接 if (!$conn) { die("连接失败:

Java操作mysql数据库简单例子

package com.Jdbc.demo; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import com.mysql.jdbc.Connection; public class jdbc02 { public static final String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&a

MySQL一些简单的操作题

1.学校想做一个选课系统,其中涉及到课程表,学生表,请分别创建这两个表,自己思考表中应有的列及数据类型. create table course ( course_name varchar(10) primary key, course_amount int, course_class char(5) ) create table student( stuid varchar(10) stuname varchar(10), stuphone char(11), sex nume('男',’'女

php操作mysql(数据库常规操作)

php操作数据库八步走 <?php // 1.建立连接 $connection = mysqli_connect('127.0.0.1', 'root', '123456'); // 2.判断连接是否成功 if (mysqli_connect_error() != null) { die(mysqli_connect_error()); } else { echo "连接成功!"; } ///3.选择数据库 mysqli_select_db($connection, 'test'

python之MySQL学习——简单的增删改查封装

1.增删改查封装类MysqlHelper.py 1 import pymysql as ps 2 3 class MysqlHelper: 4 def __init__(self, host, user, password, database, charset): 5 self.host = host 6 self.user = user 7 self.password = password 8 self.database = database 9 self.charset = charset