Python 操作mysql - 关系型数据库存储

Python 操作mysql - 关系型数据库存储

文章目录

  • Python 操作mysql - 关系型数据库存储
    • 简单介绍
    • 连接数据库
    • 创建表
    • 插入数据
    • 更新数据
    • 删除数据
    • 查询数据

简单介绍

关系型数据库是一种以“关系”的方式来组织和存储数据的数据库。它使用表(也称为“关系”)来表示数据,每个表由一组具有相同性质的列和多行数据组成。关系型数据库的主要特征包括:

  1. 数据结构化:数据以表的形式结构化存储,表由行和列组成。行代表记录,列代表字段。
  2. 主键:每张表都有一个主键,用于唯一标识表中的每一条记录。主键确保数据的唯一性。
  3. 外键:外键用于建立表与表之间的关系,连接不同表的数据。
  4. 数据完整性:关系型数据库可以通过定义约束(如主键、外键、唯一性等)来保证数据的完整性和有效性。
  5. SQL(结构化查询语言):关系型数据库使用SQL作为标准接口来进行数据查询、操作、更新和管理。通过SQL,用户可以轻松地执行复杂的数据操作。

常见的关系型数据库管理系统(RDBMS)包括:

  • MySQL
  • PostgreSQL
  • Oracle Database
  • Microsoft SQL Server
  • SQLite

关系型数据库在很多应用场景中被广泛使用,特别是对于需要复杂查询和事务处理的应用。

以mysql为例子 简单使用pymysql 操作数据库

连接数据库

import  pymysql

def connect_mysql():
    
    # 执行SQL语句
    sql = "SELECT * FROM person"
    cursor.execute(sql)
    # 获取查询结果 fetchall()方法获取所有查询结果
    rows = cursor.fetchall()
    # 打印查询结果
    for row in rows:
        print(row)
    #  关闭数据库连接
    db.close()

# 主函数
if __name__ == '__main__':
    # 创建数据库连接
    db = pymysql.connect(host='localhost', user='root', password='111111', port=3306, db='test')
    # 创建游标 利用游标可以执行SQL语句
    cursor = db.cursor()
    connect_mysql()

创建表

def create_table():
    # 创建 数据表 students
    # 字段名 id 含义 学号 类型 varchar(20)
    # 字段名 name 含义 姓名 类型 varchar(20)
    # 字段名 age 含义 年龄 类型 int
    sql = """CREATE TABLE IF NOT EXISTS students (
            id varchar(20) NOT NULL,
            name varchar(20) NOT NULL,
            age int NOT NULL,
            PRIMARY KEY (id)
            )"""
    try:
        # 执行SQL语句
        cursor.execute(sql)
        # 提交到数据库执行
        db.commit()
        print("创建数据表 students 成功")
    except:
        # 发生错误时回滚
        db.rollback()
        print("创建数据表 students 失败")

# 主函数
if __name__ == '__main__':
    # 创建数据库连接
    db = pymysql.connect(host='localhost', user='root', password='111111', port=3306, db='test')
    # 创建游标 利用游标可以执行SQL语句
    cursor = db.cursor()
    create_table()

插入数据

插入过程中要注意事务的四个属性:

  1. Atomicity 原子性 事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
  2. Consistency 一致性 事务必须是数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  3. Isolation 隔离性 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  4. Durability 持久性 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
 # 创建数据库连接
    db = pymysql.connect(host='localhost', user='root', password='111111', port=3306, db='test')
    # 创建游标 利用游标可以执行SQL语句
 cursor = db.cursor()
def insert_data():
    # 插入数据
    # 插入一条数据 (1001, '张三', 20)
    sql = "INSERT INTO students (id, name, age) VALUES (%s,%s,%s)"
    try:
        # 执行SQL语句
        cursor.execute(sql, ('1001', '张三', 20))
        # 提交到数据库执行
        db.commit()
        print("插入数据成功")
    except:
        # 发生错误时回滚
        db.rollback()
        print("插入数据失败")


# 更加通用的插入数据方法
def insert_data_more():
    # 动态传入字典数据
    data = {
        'id': '1002',
        'name':'李四',
        'age': 21,
    }
    table_name ='students'
    keys = ','.join(data.keys())  # 字段名
    values = ','.join(['%s'] * len(data))  # 占位符
    sql = "INSERT INTO {table_name} ({keys}) VALUES ({values})".format(table_name=table_name, keys=keys, values=values)
    try:
        # 执行SQL语句
        cursor.execute(sql, tuple(data.values()))
        # 提交到数据库执行
        db.commit()
        print("插入数据成功")
    except:
        # 发生错误时回滚
        db.rollback()
        print("插入数据失败")

更新数据

 # 创建数据库连接
    db = pymysql.connect(host='localhost', user='root', password='111111', port=3306, db='test')
    # 创建游标 利用游标可以执行SQL语句
 cursor = db.cursor()

def update_data():
    # 更新数据
    # 更新 id 为 1001 的学生的年龄为 22
    sql = "UPDATE students SET age = %s WHERE id = %s"
    try:
        # 执行SQL语句
        cursor.execute(sql, (22, '1001'))
        # 提交到数据库执行
        db.commit()
        print("更新数据成功")
    except:
        # 发生错误时回滚
        db.rollback()
        print("更新数据失败")

在实际的数据抓取过程中,大部分情况下需要插入数据,但是我们关心的是会不会出现重复数据,如果出现了,我们希望更新数据而不是重复保存一次再实现一种去重的方法,如果数据存在, 则更新数据;如果数据不存在,则插入数据。 另外,这种做法支持灵活的字典传值。

def insert_or_update_data(data):
    # 动态传入字典数据
    table_name ='students'
    keys = ','.join(data.keys())  # 字段名
    values = ','.join(['%s'] * len(data))  # 占位符
    sql = "INSERT INTO {table_name} ({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE {update_sql}".format(  # 这里的ON DUPLICATE KEY UPDATE 代表如果主键重复,则更新数据
        table_name=table_name, keys=keys, values=values, update_sql=','.join(['{key} = %s'.format(key=key) for key in data.keys()]))
    # sql 语句完整版本:
    # INSERT INTO students (id, name, age) VALUES (%s,%s,%s) ON DUPLICATE KEY UPDATE id = %s, name = %s, age = %s
    try:
        # 执行SQL语句
        cursor.execute(sql, tuple(data.values()) * 2)
        # 提交到数据库执行
        db.commit()
        print("插入或更新数据成功")
    except:
        # 发生错误时回滚
        db.rollback()
        print("插入或更新数据失败")

删除数据

def delete_data():
    # 删除数据
    # 删除 id 为 1001 的学生
    sql = "DELETE FROM students WHERE id = %s"
    try:
        # 执行SQL语句
        cursor.execute(sql, ('1001',))
        # 提交到数据库执行
        db.commit()
        print("删除数据成功")
    except:
        # 发生错误时回滚
        db.rollback()
        print("删除数据失败")

查询数据

def select_data():
    # 查询数据
    # 查询 age 字段大于 20 的学生的姓名和年龄
    sql = "SELECT name, age FROM students WHERE age > %s"
    try:
        # 执行SQL语句
        cursor.execute(sql, (20))
        # 获取查询结果 fetchall()方法获取所有查询结果
        rows = cursor.fetchall()
        # 打印查询结果
        for row in rows:
            print(row)
    except:
        # 发生错误时回滚
        db.rollback()
        print("查询数据失败")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring纯注解开发

在我的另一篇文章中(初识Spring-CSDN博客),讲述了Bean,以及通过xml方式定义Bean。接下来将讲解通过注解的方法管理Bean。 我们在创建具体的类的时候,可以直接在类的上面标明“注解”,以此来声明类。 1. 常…

华为欧拉系统使用U盘制作引导安装华为欧拉操作系统

今天记录一下通过U盘来安装华为欧拉操作系统 华为欧拉操作系统是国产的一个类似于Centos的Linus系统 具体实现操作步骤: 先在官网下载欧拉系统镜像点击跳转到下载 准备好一个大于16g的U盘 ,用于制作U盘启动 下载一个引导程序制作工具,我使用…

PyCharm2024.2.4安装

一、官网下载 1.从下面的链接点进去 PyCharm: The Python IDE for data science and web development by JetBrains 2.进入官网后,下载pycharm安装包 3.点击下载能适配你系统的安装包 4.安装包下载完成 二、安装 1.下载完成后,打开点击右键&#xff…

定时器的小应用

第一个项目 第一步,RCC开启时钟,这个基本上每个代码都是第一步,不用多想,在这里打开时钟后,定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

基于YOLOv8深度学习的公共卫生防护口罩佩戴检测系统(PyQt5界面+数据集+训练代码)

在全球公共卫生事件频发的背景下,防护口罩佩戴检测成为保障公众健康和控制病毒传播的重要手段之一。特别是在人员密集的公共场所,例如医院、学校、公共交通工具等地,口罩的正确佩戴对降低病毒传播风险、保护易感人群、遏制疫情扩散有着至关重…

STM32保护内部FLASH

在实际发布的产品中,在STM32芯片的内部FLASH存储了控制程序,如果不作任何保护措施的话,可以使用下载器直接把内部FLASH的内容读取回来,得到bin或hex文件格式的代码拷贝,别有用心的厂商即可利用该代码文件山寨产品。为此…

前端 - 使用uniapp+vue搭建前端项目(app端)

文章目录 前提概要项目搭建1、打开HBuilder工具,选择文件->新建->项目2、下载依赖,需要先手动创建package.json文件,在自定义文件的最外层3、创建文件夹4、创建忽略文件 .gitignore5、创建vue.config.js文件 ,解决跨域问题&…

计算机网络HTTP——针对实习面试

目录 计算机网络HTTP什么是HTTP?HTTP和HTTPS有什么区别?分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别?HTTP请求方式有哪些?请解释GET和POST的区别?HT…

飞创直线电机模组 VS 传统丝杆模组:谁是自动化传动领域的王者?

在现代自动化技术领域,直线电机模组与传统丝杆模组作为两种常见的传动方式,各自有独特的特点和优势。然而,随着科学的不断进步和应用需求的日益提高,两者在精度、速度、寿命及可拓展性方面的差异愈发显著。本文将重点对比飞创直线…

第二十一周学习周报

目录 摘要Abstract1. LSTM原理2. LSTM反向传播的数学推导3. LSTM模型训练实战总结 摘要 本周的学习内容是对LSTM相关内容的复习,LSTM被设计用来解决标准RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。LSTM通过引入门控机制来控制信息的流动,从而…

《鸿蒙生态:开发者的机遇与挑战》

一、引言 在当今科技飞速发展的时代,操作系统作为连接硬件与软件的核心枢纽,其重要性不言而喻。鸿蒙系统的出现,为开发者带来了新的机遇与挑战。本文将从开发者的角度出发,阐述对鸿蒙生态的认知和了解,分析鸿蒙生态的…

Elasticsearch基本概念及使用

Elasticsearch 是一个开源的、分布式的全文搜索和分析引擎,基于 Apache Lucene 构建。它提供了快速的搜索能力,支持大规模的数据分析,广泛应用于日志分析、全文搜索、监控系统和商业智能等领域。ES操作指令是基于restAPI构建,也就…

常用命令之LinuxOracleHivePython

1. 用户改密 passwd app_adm chage -l app_adm passwd -x 90 app_adm -> 执行操作后,app_adm用户的密码时间改为90天有效期--查看该euser用户过期信息使用chage命令 --chage的参数包括 ---m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。 ---M 密码…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理: 1.BPDU版本号识别:运行MSTP/RSTP协议的交换机会根据收到的BPDU(Bridge Protocol Data Unit,桥协议数据单元)版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

Visual Studio 2022 安装

下载链接 https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?skuCommunity&channelRelease&versionVS2022&sourceVSLandingPage&cid2030&passivefalse 安装 以c为例,列出需要勾选的项目,有3个&a…

文件 fd

🏷️ 预备工作 ❓ 当我们在系统中创建一个空文件时,这个文件要不要占据磁盘的空间(注意是空文件哟) 答案:当然是要占据磁盘的空间的,文件不仅只包括内容,还有它的属性呀,就是创建时…

树的直径计算:算法详解与实现

树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…

RHCSA学习超详细知识点2命令篇

输入命令行的语法 终端中执行命令需要遵照一定的语法,输入命令的格式如下: 命令 参数命令 -选项 参数 输入命令时可以包含多个选项,假如一个命令有-a,-b,-c,-d四个选项,可以写作 命令 -a -b -c -d 参数 这里的多个选项可以“提…

3步实现贪吃蛇

方法很简单,打开页面,复制,粘贴 一.整体思维架构 我们根据游戏的开始,运行,结束,将整个游戏划分成三个部分。在每个部分下面又划分出多个功能,接下来我们就根据模块一一实现功能。 二.Gamesta…

风电电力系统低碳调度论文阅读第一期

在碳交易市场中,历史法和基准线法是用于分配碳排放配额的两种主要方法。以下是两种方法的公式及其解释: 区别总结 历史法:基于历史排放量,分配具有较强的公平性但可能缺乏激励减排。基准线法:基于行业基准和生产量&am…