数据库

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
win系统安装mysql,详见链接描述

数据库常见命令

  • mysql -uroot -psheen
    登陆数据库
  • show databases;
    显示所有的数据库
  • create database sheen;
    创建新的数据库sheen
  • use sheen;
    进入数据库sheen
  • show tables;
    显示sheen里的所有数据库表
  • create table star(name varchar(30),age int);
    创建新的数据库表star,
  • desc star;
    查看数据库表的格式
  • insert into star VALUES('user1',10);
    插入值
  • select * from star;
    显示star数据库表中的所有内容
  • update star set age=11 where name='user1';
    更新star数据库表中user1的年龄为11
  • delete from star where name='user1';
    删除star数据库表中的user1
  • drop table star;
    删除star数据库表
  • drop database sheen;
    删除数据库sheen

连接数据库

此处,保证你有一个名为'sheen'的数据库

import pymysql
#这里注意python2需要导入数据库模块为mysqldb
#python3需要导入数据库模块为pymysql

#1.连接数据库
conn = pymysql.connect(host='localhost',user='root',passwd='sheen',
                       charset='utf8',autocommit=True)  #指定操作主机,指定用户和密码,编码格式为'utf8'时,中文才可以显示,autocommit自动提交对数据库的操作

#2.创建一个游标,用来向数据库发送指令
cur = conn.cursor()

#3.实现对数据库的增删改查

##3.1选择需要操作的数据库
conn.select_db('sheen')

#3.2对数据库内容的增删改查
try:
    #添加新的数据库表
    # add_table = 'create table star(name varchar(30),age int)'   #创建数据库表,内容有名字、年龄
    # cur.execute(add_table)    #执行数据库操作命令

    #给数据库表添加值
    # insert_sqli1 = 'insert into star VALUES ("user3", 100);'  #给数据库表更新值
    # insert_sqli2 = 'insert into star VALUES ("user4", 100);'  #给数据库表更新值
    # cur.execute(insert_sqli1)
    # cur.execute(insert_sqli2)

    #删除数据库表中的内容
    # del_table_info = 'delete from star where name="user3"'
    # cur.execute(del_table_info)

    #批量对数据实现增删改
    # users=[("user"+str(i),i)for i in range(100)]
    # insert_sqli3 = 'insert into star VALUES (%s,%s);'
    # cur.executemany(insert_sqli3,users) #批量添加信息,cur.executemany()

    #查看数据库表的信息
    select_sql = 'select * from star;'
    result = cur.execute(select_sql)
    print('查看语句的返回结果:',result)  #返回信息数目,查看语句的返回结果: 100

    #查看数据库表的内容
    # cur.fetchone类似与文件的操作f.readline, 每次只读取一条记录;
    print("此条信息:",cur.fetchone())
    print("此条信息:",cur.fetchone())
    print("此条信息:",cur.fetchone())
    # cur.fetchmany, 类似于f.readlines, 返回的是一个元组;
    print("查看5条信息",cur.fetchmany(5))    #从游标位置向后
    #cur.fetchall返回的是一个元组;
    print("第一次查找所有信息:",cur.fetchall())

    cur.scroll(0,mode='absolute')   #移动游标位置到数据库表头
    print("第二次查找所有信息:",cur.fetchall())

    cur.scroll(-10,mode='relative') #移动游标位置到数据库表倒数第10个的位置
    print("最后10个信息:",cur.fetchall())

except Exception as e:
    print("Failed:",e)
else:
    print("Success")

# 4. 先关闭游标
cur.close()
# 5. 关闭数据库连接
conn.close()

创建数据库表并添加值
图片描述
删除指定值
图片描述
批量管理
图片描述
查看
图片描述

获取数据库表信息

获取表得字段名和表头
字段名是指在以关系模型为数据结构的二维表中每一列的标识。就是数据库表的结构。
表头是可以用来索引的键值。

import pymysql
conn = pymysql.connect(host='localhost',user='root',passwd='sheen',
                       charset='utf8',autocommit=True,db='sheen')

with conn:  #安全管理器
    print("is_open:",conn.open) #Return True if the connection is open
    cur = conn.cursor()
    res = cur.execute('select * from star;')
    desc = cur.description  #返回表得格式列内容(('name', 253, None, 30, 30, 0, True), ('age', 3, None, 11, 11, 0, True))
    print("表得描述:",desc)
    print("表头:",','.join([item[0] for item in desc]))
    cur.close()

图片描述

银行转账

原账号向目标账号转账,数据写进数据库内。
做此实验前,保证你有数据库transinfo,里面有数据库表bankdata,数据库表中有账号数据和金额数据。

import pymysql

class Trans_money(object):
    def __init__(self,source_id,target_id,count):
        self.source = source_id
        self.target = target_id
        self.count = count
        self.conn = pymysql.connect(host='localhost',user='root',passwd='sheen',
                       charset='utf8',db='transinfo')   #建立数据库连接
        self.cur = self.conn.cursor()   #建立游标

    def transfer_money(self):
        """
               转账方法:
                   # 1. source_id帐号是否存在;
                   # 2. target_id帐号是否存在;
                   # 3. 是否有足够的钱
                   # 4. source_id扣钱
                   # 5. target_id加钱
                   # 6. 提交对数据库的操作
               """
        self.check_account(self.source)            # 1. source_id帐号是否存在;
        self.check_account(self.target)            # 2. target_id帐号是否存在;
        self.enough_money(self.source,self.count)  # 3. 是否有足够的钱

        try:
            self.reduce_source(self.count)     # 4. source_id扣钱
            self.increase_source(self.count)   # 5. target_id加钱
            self.conn.commit()                 # 6. 提交对数据库的操作
        except Exception as e:
            self.conn.rollback()               #撤销对于数据库的更改操作, 回滚
        else:
            print("转账成功")


    def check_account(self,account):    #判断原账户是否存在
        check_sql = 'select * from bankdata where account=%s;' %(account)
        res  = self.cur.execute(check_sql)
        if res ==1:
            return True
        else:
            print("%s此账号不存在" %(account))
    def enough_money(self,account,money):   #判断原账户是否有足够的钱
        affirm_sql = 'select money from bankdata where account=%s;' %(self.source)
        re = self.cur.execute(affirm_sql)    #返回1,游标位置在money
        exist_money = self.cur.fetchone()[0]    #查看金额数目
        print("您的账号有%s元" %(exist_money))
        if exist_money>=money:
            return True
        else:
            raise Exception("您的账号%s没有足够的金额,当前余额为%s" %(self.source,exist_money))
    def reduce_source(self,money):  #扣钱函数
        try:
            update_sql = 'update bankdata set money=money-%s where account=%s;' %(money,self.source)
            self.cur.execute(update_sql)
        except Exception as e:
            print("Failed:",e)
    def increase_source(self,money):    #加钱函数
        try:
            update_sql = 'update bankdata set money=money+%s where account=%s;' %(money,self.target)
            self.cur.execute(update_sql)
        except Exception as e:
            print("Failed:",e)

if __name__=='__main__':
    tran = Trans_money('6107001','6107002',500)
    tran.transfer_money()

前期准备
图片描述
执行结束
图片描述
数据库结果显示
图片描述


SheenStar
168 声望26 粉丝

祝你坚强