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

news2024/11/18 17:57:18

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("查询数据失败")

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

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

相关文章

Golang | Leetcode Golang题解之第565题数组嵌套

题目&#xff1a; 题解&#xff1a; func arrayNesting(nums []int) (ans int) {n : len(nums)for i : range nums {cnt : 0for nums[i] < n {i, nums[i] nums[i], ncnt}if cnt > ans {ans cnt}}return }

微服务day10-Redis面试篇

Redis主从 搭建主从集群 建立集群时主节点会生成同一的replicationID,交给各个从节点。 集群中的缓冲区是一个环型数组&#xff0c;即若从节点宕机时间过长&#xff0c;可能导致命令被覆盖。 主从集群优化 哨兵原理 哨兵是一个集群来确保哨兵不出现问题。 服务状态监控 选举…

排序算法 -快速排序

文章目录 1. 快速排序&#xff08;Quick Sort&#xff09;1.1、 简介1.2、 快速排序的步骤 2. Hoare 版本2.1、 基本思路1. 分区&#xff08;Partition&#xff09;2. 基准选择&#xff08;Pivot Selection&#xff09;3. 递归排序&#xff08;Recursive Sorting&#xff09; 2…

01、Spring MVC入门程序

概述&#xff1a; MVC(M&#xff1a;模型、V&#xff1a;视图、 C&#xff1a;控制器) 三层架构&#xff1a; 表现层&#xff08;Web层&#xff09;业务层&#xff08;Service层&#xff09;负责业务逻辑处理持久层&#xff08;Dao层&#xff09;负责和数据库交互 Spring MVC 作…

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

Android Osmdroid + 天地图 (一)

Osmdroid 天地图 前言正文一、配置build.gradle二、配置AndroidManifest.xml三、获取天地图的API Key① 获取开发版SHA1② 获取发布版SHA1 四、请求权限五、显示地图六、源码 前言 Osmdroid是一款完全开源的地图基本操作SDK&#xff0c;我们可以通过这个SDK去加一些地图API&am…

️️一篇快速上手 AJAX 异步前后端交互

AJAX 1. AJAX1.1 AJAX 简介1.2 AJAX 优缺点1.3 AJAX 前后端准备1.4 AJAX 请求基本操作1.5 AJAX 发送 POST 请求1.6 设置请求头1.7 响应 JSON 数据1.8 AJAX 请求超时与网络异常处理1.9 取消请求1.10 Fetch 发送 Ajax 请求 2. jQuery-Ajax2.1 jQuery 发送 Ajax 请求&#xff08;G…

2024年11月16日 星期六 重新整理Go技术

今日格言 坚持每天进步一点点~ 一个人也可以是一个团队~ 学习全栈开发, 做自己喜欢的产品~~ 简介 大家好, 我是张大鹏, 今天是2024年11月16日星期六, 很高兴在这里给大家分享技术. 今天又是休息的一天, 做了很多的思考, 整理了自己掌握的技术, 比如Java, Python, Golang,…

炼码LintCode--数据库题库(级别:简单;数量:55道)--刷题笔记_02

目录 炼码LintCode--数据库题库&#xff08;级别&#xff1a;简单&#xff1b;数量&#xff1a;55道&#xff09;--刷题笔记_023618 耗时前三的任务&#xff08;日期差&#xff09;题&#xff1a;sql&#xff1a;解释&#xff1a;DATEDIFF 天数差order by 别名TIMESTAMPDIFF 月…

洛谷刷题日记||基础篇8

#include <iostream> #include <vector> using namespace std;int N, M; // N为行数&#xff0c;M为列数 vector<vector<char>> field; // 表示田地的网格&#xff0c;每个元素是W或. vector<vector<bool>> visited; // 用来记录网格是否访…

在Ubuntu22.04上源码构建ROS noetic环境

Ubuntu22.04上源码构建ROS noetic 起因准备环境创建工作目录并下载源码安装编译依赖包安装ros_comm和rosconsole包的两个补丁并修改pluginlib包的CMakeLists的编译器版本编译安装ROS noetic和ros_test验证 起因 最近在研究VINS-Mono从ROS移植到ROS2&#xff0c;发现在编写feat…

从dos上传shell脚本文件到Linux、麒麟执行报错“/bin/bash^M:解释器错误:没有那个文件或目录”

[rootkylin tmp]#./online_update_wars-1.3.0.sh ba51:./online_update_wars-1.3.0.sh:/bin/bash^M:解释器错误:没有那个文件或目录 使用scp命令上传文件到麒麟系统&#xff0c;执行shell脚本时报错 “/bin/bash^M:解释器错误:没有那个文件或目录” 解决方法&#xff1a; 执行…

react+hook+vite项目使用eletron打包成桌面应用+可以热更新

使用Hooks-Admin的架构 Hooks-Admin: &#x1f680;&#x1f680;&#x1f680; Hooks Admin&#xff0c;基于 React18、React-Router V6、React-Hooks、Redux、TypeScript、Vite2、Ant-Design 开源的一套后台管理框架。https://gitee.com/HalseySpicy/Hooks-Adminexe桌面应用…

华东师范大学数学分析第五版PDF习题答案上册及下册

“数学分析”是数学专业最重要的一门基础课程&#xff0c;也是报考数学类专业硕士研究生的专业考试科目。为了帮助、指导广大读者学好这门课程&#xff0c;编者编写了与华东师范大学数学科学学院主编的《数学分析》(第五版)配套的辅导用书&#xff0c;以帮助读者加深对基本概念…

FineBI漏斗图分析转化率计算,需要获取当前节点和上一节点的转化率,需要获取错行值实现方案

FineBI漏斗图分析转化率计算&#xff0c;当前节点和上一节点的转化率&#xff0c;需要获取错行值 下面这张图大家很熟悉吧&#xff0c;非常经典的漏斗转化率分析。 从漏斗图看到需要计算转化率&#xff0c;都需要获取上一步漏斗的值&#xff0c;比如计算上一个省份的门店数量…

Solana 区块链的技术解析及未来展望 #dapp开发#公链搭建

随着区块链技术的不断发展和应用场景的扩展&#xff0c;性能和可拓展性成为各大公链竞争的关键因素。Solana&#xff08;SOL&#xff09;因其高吞吐量、低延迟和低成本的技术特性&#xff0c;在众多区块链项目中脱颖而出&#xff0c;被誉为“以太坊杀手”之一。本文将从技术层面…

FPGA开发-逻辑分析仪的应用-数字频率计的设计

目录 逻辑分析仪的应用 数字频率计的设计 -基于原理图方法 主控电路设计 分频器设计 顶层电路设计 数字系统开发不但需要进行仿真分析&#xff0c;更重要的是需要进行实际测试。 逻辑分析仪的应用 测试方式&#xff1a;&#xff08;1&#xff09;传统的测试方式&#…

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型

本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统&#xff0c;旨在通过技能匹配的方式对招聘信息进行分析与预测&#xff0c;帮助求职者根据自身技能找到最合适的职位&#xff0c;同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…

kubesphere环境-本地Harbor仓库+k8s集群(单master 多master)+Prometheus监控平台部署

前言&#xff1a;半月前在公司生产环境上离线部署了k8s集群Victoria Metrics(二开版)自研版夜莺 监控平台的搭建&#xff0c;下面我租用3台华为云服务器演示部署kubesphere环境-本地Harbor仓库k8s集群&#xff08;单master节点 & 单master节点&#xff09;Prometheus监控部…

车载诊断框架 --- UDS小白入门篇

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…