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

news2024/11/24 16:40:39

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()。用try,except来捕捉问题。

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操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

君乐宝,高端之路不好走

文|螳螂观察 作者|kinki 近日,奶粉巨头雅培发表声明称,将逐步停止中国大陆市场的婴幼儿和儿童营养产品的运营和销售,一直以来,雅培都是中国奶粉市场前十名的“常客”,但近年却跌出了“前十”的位置。 雅培的退出&am…

2023年DataWhale 1月Free Excel 第三次打卡

第三章 Excel的表合并 Excel的合并计算工具可以快速完成多个表的行列记录合并。 1.多表行合并 问题:在3个消费表格中,每个客户的消费金额不同,使用多表合并功能统计每个客户消费的总金额。 具体步骤: 1.选择需要汇总的单元格…

ZooKeeper 技术内幕|Leader 选举是一个什么样的过程

几个问题,引发思考: 什么时候 leader 选举? 选举的过程? 选举过程中,是否能提供服务? 选举结果,是否会丢失数据? 服务器角色 2 个小问题: 服务器节点有多少角色&…

如何实现连杆码垛机械臂的逆解计算?

1. 连杆码垛机械臂介绍 连杆码垛机器人是工业应用场景中常用的一种机械臂,常用于简单的大负载搬运作业场景。常见的连杆码垛机械臂都是4个自由度,相较于6轴和7轴的机械臂成本较低。 连杆码垛机械臂的运动特性是:末端始终平行于地面。第一个平…

【算法】一篇文章弄清楚KMP算法的实现

目录 前言: 一.KMP算法简介: 二.next数组的介绍及实现 三.next数组的优化 四.伪代码和完整代码的实现 总结: 博客主页:张栩睿的博客主页 欢迎关注:点赞收藏留言 系列专栏:c语言学习 家人们写博客真…

小白的性能测试探索之路(1)

​​​​​​​ 某一天,领导突然就拉了个会说,我们成立稳定性专项,以测试为主力提升服务的整体稳定性? 当时我的内心是:“what”,性能测试我完全没接触过呀,i am a little tester~而…

华为MPLS-HubSub组网实验配置

目录 配置接口IP地址以及底层IGP协议 配置MPLS LDP协议 Sub与Hub建立Vpnv4邻居 配置PE与CE对接命令 Sub-PE与CE对接配置 Hub与CE对接配置 发现问题 PE与CE之间都采用EBGP方式进行路由传递 MPLS隧道——Hub&Spoke组网_静下心来敲木鱼的博客-CSDN博客_hub spokehttps…

Flume第二章:企业案例

系列文章目录 Flume第一章:环境安装 Flume第二章:企业案例 文章目录系列文章目录前言一、复制和多路复用1.案例需求2.案例实现3.结果查看二、负载均衡和故障转移1.需求案例2.案例实现3.结果查看三、聚合1.案例需求2.案例实现3.查看结果总结前言 这次我…

用python写的代码输入助手小程序(附源码)

命令太多,很容易忘记,还有很多代码片段想保存下来用到的时候能够快速输入,提高开发效率。在网上找了很多,发现都不是自己想要的。于是就用python写了一个自己用的代码输入助手小程序,我自己已经用了很长时间了&#xf…

工业中常用流量计及其测量原理

一、流量计单位 工程上常用单位m3/h,它可分为瞬时流量(Flow Rate)和累计流量(Total Flow),瞬时流量即单位时间内过封闭管道或明渠有效截面的量,流过的物质可以是气体、液体、固体;累…

Introduction to Multi-Armed Bandits——02 Stochastic Bandits

Introduction to Multi-Armed Bandits——02 Stochastic Bandits 参考资料 Slivkins A. Introduction to multi-armed bandits[J]. Foundations and Trends in Machine Learning, 2019, 12(1-2): 1-286. 在线学习(MAB)与强化学习(RL)[2]:IID Bandit的一些算法 B…

化繁为简、性能提升 -- 在WPF程序中,使用Freetype库心得

本人使用WPF开发了一款OFD阅读器,显示字体是阅读器中最重要的功能。处理字体显示有多种方案,几易其稿,最终选用Freetype方案。本文对WPF中如何使用Freetype做简单描述。 OFD中有两种字体:嵌入字体和非嵌入字体。1) 非…

【vue2】vue生命周期的理解

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:vue生命周期的介绍、vue生命周期钩子函数详解,vue生命周期的执行顺序 目录 …

使用管控平台管理redis集群

1 添加redis集群 在数据库资源中添加redis集群,配置参数并将URL中cluster调整为true。 2 验证配置资源是否正常 3 操作redis数据库中的数据 可以通过使用图形化界面或者命令窗口进行Redis数据库的CRUD 3.1 图形化界面操作 操作Redis字符串列表 3.1.1 新增 右…

Apache Iceberg 背后的设计

原文地址: 阿帕奇冰山:幕后的建筑外观 |德雷米奥 (dremio.com)绝对的精品文章!!!机器翻译和自我调整组成了这篇文章,供大家学习。介绍数据湖的构建希望是实现数据民主化,以允许越来越多的人员、工具和应用程序使用越来越多的数据。实现这一目…

十五天学会Autodesk Inventor,看完这一系列就够了(八),图框自定义

所周知,Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计,现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad,所以再学习Inventor&#x…

【数据库数据恢复】华为云mysql数据库数据被delete的数据恢复案例

数据库数据恢复环境: 华为云ECS,linux操作系统; mysql数据库,实例内数据表默认存储引擎为innodb。 数据库故障: 在执行数据库版本更新测试时,用户误将本应在测试库测试的sql脚本执行在生产库中&#xff0c…

拉伯证券|芯片半导体迎来“行业底部出清”,大资金进场迹象明显

近期关于小芯片的利好不断,英特尔近期就发布了根据小芯片技能的处理器,而近期长电科技也在小芯片范畴获得突破。据长电科技在互动平台表明,公司现已完成4nm工艺制程手机芯片的封装,最大封装体面积约为1500平方毫米的体系级封装。长…

人工智能所需高等数学知识大全(收藏版)

来源:投稿 作者:愤怒的可乐 编辑:学姐 不懂数学是学不好人工智能的,本系列文章就汇总了人工智能所需的数学知识。本文是高等数学篇。 另有线代篇和概率论篇 函数与极限 函数 yf(x) ,x是函数f的自变量,y是因变量 函…

数据结构(4)线段树、延迟标记、扫描线

活动 - AcWing 参考-《算法竞赛进阶指南》 一、延迟标记(懒标记) 在线段树的区间查询命令中,每当遇到被查询区间[l,r]完全覆盖节点时,可以直接把节点上的答案作为备选答案返回。我们已经证明,这样操作的复杂度为O(4…