python-MySQL数据库基础(三)MySQL与python交互

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

MySQL与python交互

在这里插入图片描述
用python代码来连接数据库执行SQL语句来查询到数据库中的数据。
当一张表中的数据量比较多时而我们只需要查询其中的某个字段数据直接查询会导致效率降低此时就需要建立分表。

python操作MySQL步骤

安装pymysql

pip install pymysql

connection对象建立与数据库的连接创建对象调用connect()方法。
cursor游标读取一行一行的数据
在这里插入图片描述
代码实现过程如下

# 第一种导入
# from pymysql import *
# connect()
# 第二种导入
import pymysql
# 1.连接数据库user和password 都是直接设置的
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='hww-sql',db='shopping',charset='utf8')
# 2.获取游标对象
cs = conn.cursor()

# 3. 通过游标对象执行sql语句受影响的行数
r =cs.execute('select * from goods;')
print(r)  # 得到的是数据的条数21

# 4. 获取数据通过游标获取数据执行完一行游标会在第二行
print(cs.fetchone())  # 获取的是第一条数据
print(cs.fetchone())  # 获取的是第二条数据
# 4.1 fechmany()默认不传参数返回一条数据
print(cs.fetchmany())
print(cs.fetchmany(2))  # 括号内的数字是获取数据的条数
# 4.2 获取全部的数据
# print(cs.fetchall())  # 获取全部的数据
# 获取全部数据后再去获取数据就得不到数据返回None
# print(cs.fetchone())  # None获取所有数据后游标在末尾不会重新获取

# 5. 关闭
# 5.1 关闭游标
cs.close()
# 5.2 关闭连接
conn.close()

# 关闭后还可以获取数据有缓存的
print('*'*50)
print(cs.fetchone())

异常捕获

当端口号等信息出现错误的时候为了保证程序的正常运行就需要进行异常捕获

import pymysql
try:
    conn = pymysql.connect(host='127.0.0.1',port=3307,user='root',passwd='hww-sql',db='shopping',charset='utf8')
except Exception as e:
    print(e) # e是对象并不是元组代表的是Exception
    print(e.args[0])  # 取出第一个值 2003

封装DB

用类来做封装单独分成模块实现单独的某个功能。

from pymysql import *

'''
1.连接数据库在实例化的时候连接数据库
2.实现程序执行完毕后自动关闭
'''
class MyDb(object):
    # 2.初始化自动连接数据库
    def __init__(self):
        self.my_conn()
    # 1.定义连接数据库的方法
    def my_conn(self):
        # 实例化方法
        try:
            self.conn = connect(host='127.0.0.1',port=3306,user='root',passwd='hww-sql',db='shopping',charset='utf8')
        except Exception as e:
            print(e)

    # 3. 获取单条数据
    def get_one(self):
        # 3.1 获取游标
        cs = self.conn.cursor()
        # 3.2 执行sql语句
        sql = 'select * from goods'
        # 执行sql语句
        cs.execute(sql)
        # 3.3 获取执行的结果
        res = cs.fetchone()
        # 3.4 只关闭游标
        cs.close()
        return res

    # 4. 获取全部数据
    def get_all(self):
        # 4.1 获取游标
        cs = self.conn.cursor()
        # 4.2 执行sql语句
        sql = 'select * from goods'
        # 执行sql语句
        cs.execute(sql)
        # 4.3 获取执行的结果
        res = cs.fetchall()
        # res = cs.fetchmany(5) # 传入参数值
        # 4.4 只关闭游标
        cs.close()
        return res
    # 关闭连接需把关闭连接单独定义否则第二次调用的时候连接就关闭了
    # def close_conn(self):
    #     self.conn.close()
    # 程序执行完毕之后自动执行关闭的方法
    def __del__(self):
        self.conn.close()
def main():
    # 实例化对象
    db =MyDb()
    # data =db.get_one()  # 每次执行都会创建一个游标
    # print(data)
    # data = db.get_one()  # 访问的始终的第一个数据因为每次执行都重新创建一个游标
    # print(data)
    all_data = db.get_all()
    # print(all_data)
    # 遍历取出所有数据
    for data in all_data:
        print(data)
if __name__ == '__main__':
    main()

首先导入库用类进行封装代码的框架为定义类、函数main()、程序的入口。定义连接数据库的方法用init方法在实例化的时候就自动进行连接数据库然后是进行获取数据获取单条数据先获取游标再执行sql语句获取执行的结果最后关闭游标和连接把获取到的res 返回到main函数里函数的调用处。如果进行二次函数调用的话就报错因为第一次调用后与数据库的连接已经关闭了为了反复获取数据需要把关闭连接单独存放。关闭游标不用单独存放因为方法调用的时候每次都重新定义了游标所以每次取值都是从第一条数据开始取。定义获取多条数据的函数跟获取单条数据的函数类似在main函数里调用函数获取到全部的数据数据获取得到的是元组可以用遍历的方法逐个取出。对代码进行优化用del方法实现在代码执行结束的时候自动执行关闭连接。

插入数据

导入库创建操作数据库的函数进行数据库的连接、获取游标、插入数据、执行sql语句、关闭游标和连接。程序正常运行但是未能增加数据此时为引擎的问题MyIsAM 不需要提交事务就可以修改数据Innodb 修改表的数据需要进行提交事务安全性更高需要在关闭游标前用commit提交事务此时数据表的内容就可以添加进去了。如果有多个sql语句一个commit可以提交多个事务。添加数据语句发生错误数据不能正常添加进去但是会占用数据表中的id因为服务器端会接收。
如果执行多条sql语句只要有一条错误就不进行添加好比银行卡转钱信息错误会自动返回原账户可以用回滚来实现 conn.rollback()。用tryexcept来捕捉问题。

import pymysql
def coperation_db():
    try:
        # 连接数据库
        conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='hww-sql',db='mytest-01',charset='utf8')
        # 获取游标
        cs = conn.cursor()
        # 插入数据
        sql = "insert into mytable1 (name) value ('xiaoming11');"
        # 执行sql语句
        cs.execute(sql)
        # 插入数据
        sql = "insert into mytable1 (name) value ('xiaoming22');"
        # 执行sql语句
        cs.execute(sql)
        # 提交事务一次性可以提交多个
        conn.commit()
        # 关闭游标
        cs.close()
        # 关闭连接
        conn.close()
    except  Exception as e:
        conn.rollback()
        
if __name__ == '__main__':
    coperation_db()

在这里插入图片描述

使用面向对象完成商品的查询

'''
输入1查询所有商品
输入2所有商品种类
输入3查询所有品牌
输入4退出
输入5插入数据
'''
import pymysql
class Shopping(object):
    def __init__(self):
        self.conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='hww-sql',db='shopping',charset='utf8')
        self.cs =self.conn.cursor()
    # 用户输入的模板
    def run(self):
        while True:
            num = self.print_meun()
            if num == '1':
                self.show_all_goods()
            elif num == '2':
                self.show_all_cates()
            elif num == '3':
                self.show_all_brands()
            elif num == '4':
                break
            elif num == '5':
                self.add_cate()
            else:
                print('你输入的内容错误')
    # 写入的内容不需要参数不需要self
    # 静态方法的装饰器
    @staticmethod
    def print_meun():
        print('-----shop-----')
        print('输入1查询所有商品')
        print('输入2所有商品种类')
        print('输入3查询所有品牌')
        print('输入4退出')
        print('输入5插入数据')
        num = input('请输入选项')
        return num
    # 查询所有的商品避免代码重复写把执行sql语句获取所有的结果遍历循环得到的数据单独列出来
    def show_all_goods(self):
        sql = 'select * from goods'
        self.excute_sql(sql)
    # 查询所有的商品种类
    def show_all_cates(self):
        sql = 'select * from goods_cates'
        self.excute_sql(sql)

    # 查询所有的品牌并进行去重
    def show_all_brands(self):
        sql = 'select distinct brand_name from goods'
        self.excute_sql(sql)

    # 添加商品分类
    def add_cate(self):
        name = input('请输入商品分类名字')
        # 要注意 value 后跟的是字符串格式化字符串后得到数据不带引号要在格式化字符串的时候加上引号
        # f"-- insert into goods_cates (name) value (商品信息)"
        sql = f"insert into goods_cates (name) value ('{name}')"
        self.excute_sql(sql)
        # 提交事务
        self.conn.commit()
    # 单独定义函数执行sql语句减少重复代码
    def excute_sql(self,sql):
        self.cs.execute(sql)
        res = self.cs.fetchall()
        for data in res:
            print(data)
    # 自动关闭连接
    def __del__(self):
        self.conn.commit()

def main():
    shop = Shopping()
    shop.run()
if __name__ == '__main__':
    main()

导入库搭建代码的框架创建购物类定义main函数建立主程序的入口。在实例化对象初始化的时候就进行连接数据库、获取游标对象。创建输入模板用于用户进行选择提示用户进入模块提示用户输入可以用whlie True进行死循环状态一直进行输入。判断接收用户的输入是否为1-4进行判断并分别执行不同的代码。输入模板函数种的self与一系列print没有关系可以单独把print的内容拿出来利用静态方法的装饰器定义里面没有任何参数的函数在while True里调用此函数。定义查询所有商品的函数创建查询执行sql语句获取所有的结果遍历循环得到的数据。然后定义所有商品种类、查询所有的品牌函数中的执行sql语句、获取所有的结果、遍历循环内容都是重复的可以把重复的内容进行单独的封装单独定义函数用来执行sql语句然后在每个函数里调用此方法。根据用户输入的内容分别调用这几个函数。

视图

视图(view)是一种虚拟存在的表对于使用视图的用户来说基本上是透明的视图并不在数据库中实际存在行和列数据来自定义视图的查询中使用的表并且是在使用视图时动态生成的.

  1. 定义视图 create view 视图名称 as select 语句;
  2. 查看视图查看表的时候会把视图表页列出来 show tables;
  3. 使用视图 select * from v_pro;
  4. 删除视图 drop view 视图名称

视图的作用

  • 简单提高了重用性就像一个函数避免代码的重复书写
  • 安全提高了安全性能可以针对不同的用户设定不同的视图比如公司的薪水不让别人查看可以构建一个不带薪水的视图供员工查看
  • 数据独立一旦视图的结构确定了可以屏蔽表结构变化对用户的影响源表增加列对视图没有影响源表修改列名则可以通过修改视图来解决不会造成对访问者的影响
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

有以下内容出现不能进行视图的修改。

  • select子句中包含distinct、组函数
  • select语句中包含group by、order by子句以及相关子查询
  • from子句中包含多个表
  • 如果视图中有计算量则不能更新
  • 如果基表中有某个具有非空约束的列未出现在视图定义中则不能做insert操作
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6