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