连接数据库的操作
import pymysql
1. 连接数据库, host, user, passwd, charset
conn = pymysql.connect(host='172.25.254.74', user='hello',
password='hello', charset='utf8', autocommit=True)
2. 创建一个游标, 用来给数据库发送sql语句的;
cur = conn.cursor()
3. 对于数据库实现增删改查操作
选择需要操作的数据库
conn.select_db('westos')
try:
# # 要执行的sql
# create_sql = 'create table myuser (name varchar(30), age int );'
# # delete_sql
# # update_sql
# cur.execute(create_sql)
# insert_sqli1 = 'insert into myuser VALUES ("user3", 100);'
# insert_sqli2 = 'insert into myuser VALUES ("user4", 100);'
# cur.execute(insert_sqli1)
# cur.execute(insert_sqli2)
# delete_sqli = 'delete from myuser where name="user2";'
# cur.execute(delete_sqli)
# # 提交所有对数据库的操作;
# # conn.commit()
# **************批量对数据实现增删改;
# users = [('user'+str(i), i) for i in range(100)]
# insert_sqli = 'insert into myuser VALUES (%s, %s);'
# cur.executemany(insert_sqli, users)
select_sqli = 'select * from myuser;'
res = cur.execute(select_sqli)
print("查看语句的返回结果:", res)
# *****************88查看查看表中的数据
# # cur.fetchone类似与文件的操作f.readline, 每次只读取一条记录;
# print("查找一条记录:", cur.fetchone())
# print("查找一条记录:", cur.fetchone())
# print("查找一条记录:", cur.fetchone())
# print("查找一条记录:", cur.fetchone())
# cur.fetchmany, 类似于f.readlines, 返回的是一个元组;
# print("查找5条记录:",cur.fetchmany(5))
# cur.fetchall返回的是一个元组;
print("查找1所有记录", cur.fetchall())
# 移动游标的位置, 到记录的最开始
# cur.scroll(0, mode='absolute')
# print("查找2所有记录", cur.fetchall())
cur.scroll(-10, mode='relative')
print("查找2所有记录", cur.fetchall())
except Exception as e:
print("Fail:", e)
else:
print("Success")
4. 先关闭游标
cur.close()
5. 关闭数据库连接
conn.close()
安全管理器
with open('/etc/passwd') as f:
print(f.read(5))
f = open('/etc/passwd')
with f:
print(f.closed)
print(f.read(5))
print(f.closed)
银行转账案例
要求用数据库实现A给B转账之后,A拥有的金额减小,B拥有的金额增加,若出现意外,转账作废
import pymysql
class Transfermoney(object):
def __init__(self,conn):
self.conn=conn
self.cursor=conn.cursor()
def transfer(self,source_accid,target_accid,money):
"""
转账方法:
# 1. source_accid帐号是否存在;
# 2. target_accid帐号是否存在;
# 3. 是否有足够的钱
# 4. source_accid扣钱
# 5. target_acci加钱
# 6. 提交对数据库的操作
:param source_accid: 源帐号id
:param target_accid: 目标帐号id
:param money: 转账金额
:return: bool
"""
#判断帐号是否存在
self.check_account_avaiable(source_accid)
self.check_account_avaiable(target_accid)
#是否有足够的钱
self.has_enough_money(source_accid)
try:
#source_accid扣钱
self.reduce_money(source_accid,money)
print(a)
#target_accid加钱
self.add_money=(target_accid,money)
self.conn.commit()
except Exception as e:
self.conn.commit()
else:
print('%s给%s转账%s成功' %(source_accid,target_accid,money))
def check_account_avaiable(self,accid):
"""判断帐号是否存在,传递参数为帐号id"""
select_sqli='select * from bankData where id=%s' %(accid)
print('execute sql:',select_sqli)
res=self.cursor.execute(select_sqli)
#判断是否能找到帐号为accid的记录
if res==1:
return True
else:
raise Exception('帐号%s不存在' %(accid))
def has_enough_money(self,accid,money):
"""是否有足够的钱"""
select_sqli='select money from bankData where id=%s' %(accid)
print('execute sql:',select_sqli)
self.cursor.execute(select_sqli)
#获取查询到的金钱数额
acc_money=self.cursor.fetchone()[0]
print(acc_money,type(acc_money))
#判断
if acc_money>=money:
return True
else:
raise Exception('账户%s没有足够的金额,当前余额%s' %(accid,money))
def reduce_money(self,accid,money):
#对于accid减少的金额为money
try:
update_sqli='update bankData set money=money-%s where id=%s' %(money,accid)
print('reduce_money sql:',update_sqli)
self.cursor.execute(update_sqli)
except Exception as e:
print('Error:',e)
def add_money(self,accid,money):
#对于accid增加的金额为money
try:
update_sqli='update bankData set money=money+%s where id=%s' %(money,accid)
print('add_money sql:',update_sqli)
self.cursor.execute(update_sqli)
except Exception as e:
print('Error:',e)
def __del__(self):
#删除对象时,自动执行,关闭游标
self.cursor.close()
if __name__=='__main__':
conn=pymysql.connect(host='172.25.254.74',user='hello',
passwd='hello',charset='utf8',db='westos')
trans=Transfermoney(conn)
trans.transfer('610003','610002,100')
def create_data():
#1.连接数据库,host,user,passwd,charset
conn=pymysql.connect(host='172.25.254.74',user='hello',
passwd='hello',charset='utf8',
autocommit=True,db='westos')
#2.创建一个游标,用来给数据库发送sql语句
cur=conn.cursor()
#3.创建一个表
try:
create_sqli='create table bankData(id int PRIMARY KEY,' \
'name varchar(10),money FLOAT);'
cur.execute(create_sqli)
except Exception as e:
print('Error:表已经创建',e)
else:
print('表创建成功')
#4.创建数据
try:
users=[(610001,'张三',1000),(610002,'李四',1000),(610003,'粉条',1000)]
insert_sqli='insert into bankData VALUES (%s %s %s);'
cur.executemany(insert_sqli,users)
except Exception as e:
print('Error:',e)
else:
print('初始化数据成功')
#4.先关闭游标
cur.close()
#5.关闭数据库连接
conn.close()
获取表的字段名和信息
import pymysql
#1,连接数据库 host user passwd charset
conn=pymysql.connect(host='172.25.254.74',user='hello',
passwd='hello',charset='utf8',
autocommit='True',db='westos')
with conn:
print('is_open',conn.open)
#2.创建一个游标,用来给数据库发送sql语句的
cur=conn.cursor()
#3.对于数据库实现增删改查操作
#显示有多少行记录
res=cur.execute('select * from myuser;')
#显示每列的详细信息
desc=cur.description
print('表的描述:',desc)
#获取表头
print('表头',','.join([item[0] for item in desc]))
#4.先关闭游标
cur.close()
成绩管理
“”“文件score.dat中保存的是100名学生的姓名和Python课、高数和英语成绩。
1)定义学生类,其中包含姓名、Python课、高数和英语成绩及总分、均分数据成员,成员函数根据需要确定。
2)读入这名学生的成绩,用对象列表进行存储。
3)求出各科和总分的最高分。
4)请按总分的降序(高成绩在前,低成绩在后)排序
5)在屏幕上显示各科及总分的最高分,排序后的成绩单(包括总分)保存到文件odered_score.dat中。
6) 将文件中的所有学生信息, 保存在mariadb数据库中
“”“
import random
import pymysql
from itertools import chain
#生成100名学生的成绩
def createdata():
with open('score.dat', 'w') as f:
for i in range(1,101):
name = 'student' + str(i)
python_score = random.randint(60, 100)
math_score = random.randint(60, 100)
english_score = random.randint(60, 100)
f.write(name + '\t' + str(python_score) + '\t' + str(math_score) + '\t' + str(english_score) + '\n')
#建立Student类
class student(object):
def __init__(self, name, python_score, math_score, english_score):
self.name = name
self.python_score = python_score
self.math_score = math_score
self.english_score = english_score
self.sumscore = float(python_score) + float(math_score) + float(english_score)
self.averagescore = self.sumscore / 3
def __repr__(self):
return '姓名:%s python分数:%s 高数分数:%s 英语分数:%s 总分:%s 平均分:%.2f' % (
self.name, self.python_score, self.math_score, self.english_score, self.sumscore, self.averagescore)
def main():
createdata()
#读取 score.dat 文件中的学生成绩,并使用对象列表存储
with open('score.dat') as f:
studentlist = [student(*line.split()) for line in f.readlines()]
#输出各科成绩最高分
print('python最高分:%s' % max(studentlist, key=lambda x: x.python_score).python_score)
print('高数最高分:%s' % max(studentlist, key=lambda x: x.math_score).math_score)
print('英语最高分:%s' % max(studentlist, key=lambda x: x.english_score).english_score)
#对总成绩进行排序,并输出最高分,将排序后的成绩写入文件 odered_score.dat
sumscorelist = sorted(studentlist, key=lambda x: x.sumscore, reverse=True)
print('总分最高:%s' % sumscorelist[0].sumscore)
with open('odered_score.dat', mode='w') as f:
for i in sumscorelist:
print(i)
f.write(str(i) + '\n')
#读取 odered_score.dat 文件, 并将数据写入数据库
with open('odered_score.dat') as f:
conn = pymysql.connect(host='172.25.254.69',user='hello', password='hello', charset='utf8', db='mariadb', autocommit=True)
cur = conn.cursor()
#cur.execute('drop table student;')
newcreate = 'create table student(姓名 varchar(10) not null, python成绩 varchar(5), 高数成绩 varchar(5), 英语成绩 varchar(5), 总分 varchar(5), 平均分 varchar(5));'
cur.execute(newcreate)
for line in f.readlines():
getuseful = [i.split(':') for i in line.split()]
useful = list(chain(*getuseful))[1::2]
linkuse = "insert into student values('%s', '%s', '%s', '%s', '%s', '%s');" % (
useful[0], useful[1], useful[2], useful[3], useful[4], useful[5])
#print(linkuse)
cur.execute(linkuse)
cur.close()
conn.close()
main()