Python连接数据库 增删检查 并且模拟银行操作

Python连接数据库 增删检查 并且模拟银行操作

什么是 PyMySQL?
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

查询数据库

import pymysql

#与java相比没有分号来隔开一条语句
conn=pymysql.connect(host = '127.0.0.1',
                                       port = 3306,#注意这里不是字符串
                                       user = 'root',
                                        passwd = '092248',
                                        db = 'python',
                                       charset = 'utf8'
                                     )
#通过一个游标对象来接受  类似于java的实体类
cursor = conn.cursor();

#利用sql进行查询
sql = "select * from user"
cursor.execute(sql)

'''
获取结果     利用一个类似于游标的方法 
 cursor.rowcount 影响的行数
 cursor.fetchone()获实体
 这种方法避免数据太多 遍历会堵塞
'''
#第一个
rs =  cursor.fetchone()
print rs
#第2~第4
rs =  cursor.fetchmany(3)
print rs
#剩下所有 
rs =  cursor.fetchall()
#1.如何遍历    2.获取表的某一元素    类似 for(对象 s:对象集合)   打印类似C
for row in rs :
         print"id=%s,name=%s" % row)

#每次都要关闭资源
cursor.close();
conn.close();
复制代码

含有事务的增、删、修改的数据库操作
事务的特点

  • 原子性:多条指令作为一个集体,要么都执行,要么都不执行
  • 一致性:比如 a=100 b=100 a、b之间交易 总和一定是200
  • 隔离性:一个事务不受其他事务的影响
  • 持久性:事务一旦提交,它对数据库的改变时永久性的
import pymysql

conn = pymysql.connect(
 host = '127.0.0.1',
port = 3306,
user = 'root',
passwd= '092248',
db = 'python',
charset = 'utf8',
)

cursor = conn.cursor()

sql_insert = "insert into user (id, name) values(10, 'wang')"
sql_update = "update user set name='wang' where id='1' "
sql_delete = "delete from user where id='2' "

try:
     cursor.execute(sql_insert)
     print(cursor.rowcount)
     cursor.execute(sql_update)
     print(cursor.rowcount)
     cursor.execute(sql_delete)
     print (cursor.rowcount)
#没有提交上述语句都没法执行
     conn.commit()
#若是有错误就回滚到上述语句执行前  比如12执行成功 在3却错误了
except Exception as e:
    print (e)
conn.rollback()

#关闭资源
cursor.close()
conn.close()
复制代码

模拟银行操作:

import sys
import pymysql
    # 声明一个类
class TransferMoney(object):
# 构造函数
    def __init__(self, conn):
        self.conn = conn
# 账户可用性
    def check_acct_available(self,acctid):
        cursor=self.conn.cursor()
        try:
            sql = "select * from account where acctid=%s" % acctid
            cursor.execute(sql)
            print ("检查用户可用性" + sql)
            rs = cursor.fetchall()
            if len(rs) != 1:
                raise Exception("账号%s不存在" % acctid)
        finally:
                cursor.close()
    # 余额够否
    def has_enough_money(self, acctid, money):
        cursor = self.conn.cursor()
    
        try:
            # 用这种方式给SQL语句注入参数
            sql = "select * from account where acctid=%s and money>%s" % (acctid, money)
            cursor.execute(sql)
            print ("检查用户可用性" + sql)
            rs = cursor.fetchall()
            if len(rs)!= 1:
                    raise Exception("%s的余额不足" % acctid)
        finally:
            cursor.close()
    
    # 减钱
    def reduce_money(self, acctid, money):
        cursor = self.conn.cursor()
        try:
        # 用这种方式给SQL语句注入参数
            sql = "update account set money=money -%s where acctid=%s" % (money, acctid)
            cursor.execute(sql)
            print ("减钱" + sql)
            rs = cursor.fetchall()
            if cursor.rowcount != 1:
                raise Exception("%s减钱失败" % acctid)
        finally:
                cursor.close()
        
        
    # 加钱
    def add_money(self, acctid, money):
        cursor = self.conn.cursor()
        try:
            # 用这种方式给SQL语句注入参数
            sql = "update account set money=money +%s where acctid=%s" % (money, acctid)
            cursor.execute(sql)
            print ("加钱" + sql)
            rs = cursor.fetchall()
            if cursor.rowcount != 1:
                raise Exception("%s加钱失败" % acctid)
        finally:
            cursor.close()
    
        
    # 具体操作方法
    def transfer(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)  # A钱够
            self.reduce_money(source_acctid, money)  # A减钱
            self.add_money(target_acctid, money)  # B加钱
            self.conn.commit()
    
    
        except Exception as e:
            self.conn.rollback()
            raise e  # 将异常重新抛出




if __name__=="__main__":
      # sys是在运行时在config中注入参数
    '''
    source_acctid = sys.argv[1]
    target_acctid = sys.argv[2]
    money = sys.argv[3]
    '''
    conn = pymysql.connect(
     host='127.0.0.1',
    port=3306,
    user='root',
    passwd='092248',
    db='python',
    charset='utf8'
    )
    # TransferMoney是一个类  通过封存类来实现操作  这里新建一个类对象
    tr_money =TransferMoney(conn)
    
    try :
        tr_money.transfer(1, 2, 100)
    except Exception as e:
        print ("出现的问题:" + str(e))
    conn.close()
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享