Python入门16

连接数据库的操作

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()

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_42725815/article/details/82691903
今日推荐