数据存储:一文掌握存储数据到mysql的详细使用

news2025/2/28 6:30:40

文章目录

    • 一、环境准备
      • 1.1 安装MySQL数据库
      • 1.2 安装Python MySQL驱动
    • 二、连接到MySQL数据库
    • 三、执行基本的CRUD操作
      • 3.1 创建(Create):插入数据
      • 3.2 读取(Read):查询数据
      • 3.3 更新(Update):更新数据
      • 3.4 删除(Delete):删除数据
      • 3.5 完整代码示例
    • 四、使用上下文管理器简化连接和游标管理
    • 五、处理事务
    • 六、使用ORM框架(推荐)
    • 七、最佳实践
    • 八、总结

在数据采集、处理和存储过程中,MySQL作为一种广泛使用的关系型数据库管理系统,因其高性能、可靠性和易用性而备受青睐。Python提供了多种库来连接和操作MySQL数据库,其中最常用的是mysql-connector-python和PyMySQL。本文将详细介绍如何使用Python连接MySQL数据库,执行基本的CRUD(创建、读取、更新、删除)操作,并提供相应的代码示例。

一、环境准备

1.1 安装MySQL数据库

确保已经在系统中安装并运行了MySQL数据库。可以从 MySQL官方网站 下载并安装适合你操作系统的版本。

1.2 安装Python MySQL驱动

使用pip安装mysql-connector-python或PyMySQL库。这里以PyMySQL为例:

pip install PyMySQL

二、连接到MySQL数据库

首先,需要使用Python代码连接到MySQL数据库。以下是使用PyMySQL连接数据库的基本步骤:

import pymysql

# 连接参数
connection = pymysql.connect(
    host='localhost',        # 数据库主机地址
    user='your_username',    # 数据库用户名
    password='your_password',# 数据库密码
    database='your_database',# 要连接的数据库名称
    charset='utf8mb4',       # 字符集
    cursorclass=pymysql.cursors.DictCursor  # 返回字典类型的结果
)

try:
    with connection.cursor() as cursor:
        # 在此处执行SQL语句
        pass
finally:
    connection.close()

三、执行基本的CRUD操作

3.1 创建(Create):插入数据

使用INSERT INTO语句向表中插入数据。

import pymysql

connection = pymysql.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    database='test_db',
    charset='utf8mb4',
    cursorclass=pymysql.cursors.DictCursor
)

try:
    with connection.cursor() as cursor:
        sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)"
        cursor.execute(sql, ('张三', 28, 'zhangsan@example.com'))
    connection.commit()  # 提交事务
finally:
    connection.close()

3.2 读取(Read):查询数据

使用SELECT语句从表中查询数据。

import pymysql

connection = pymysql.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    database='test_db',
    charset='utf8mb4',
    cursorclass=pymysql.cursors.DictCursor
)

try:
    with connection.cursor() as cursor:
        sql = "SELECT id, name, age, email FROM users WHERE age > %s"
        cursor.execute(sql, (25,))
        results = cursor.fetchall()
        for row in results:
            print(row)
finally:
    connection.close()

3.3 更新(Update):更新数据

使用UPDATE语句修改表中的数据。

import pymysql

connection = pymysql.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    database='test_db',
    charset='utf8mb4',
    cursorclass=pymysql.cursors.DictCursor
)

try:
    with connection.cursor() as cursor:
        sql = "UPDATE users SET age = %s WHERE name = %s"
        cursor.execute(sql, (29, '张三'))
    connection.commit()
finally:
    connection.close()

3.4 删除(Delete):删除数据

使用DELETE语句删除表中的数据。

import pymysql

connection = pymysql.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    database='test_db',
    charset='utf8mb4',
    cursorclass=pymysql.cursors.DictCursor
)

try:
    with connection.cursor() as cursor:
        sql = "DELETE FROM users WHERE name = %s"
        cursor.execute(sql, ('李四',))
    connection.commit()
finally:
    connection.close()

3.5 完整代码示例

以下是一个完整的Python脚本,演示了如何连接MySQL数据库并执行CRUD操作。

import pymysql

# 数据库连接配置
config = {
    'host': 'localhost',        # 数据库主机地址
    'port': 3306,               # 数据库端口,默认3306
    'user': 'your_username',    # 数据库用户名
    'password': 'your_password',# 数据库密码
    'database': 'test_db',      # 要连接的数据库名称
    'charset': 'utf8mb4',       # 字符集
    'cursorclass': pymysql.cursors.DictCursor  # 返回字典类型的结果
}

def create_database(cursor):
    """创建数据库"""
    cursor.execute("CREATE DATABASE IF NOT EXISTS test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;")
    print("数据库创建成功或已存在。")

def create_table(cursor):
    """创建表"""
    create_table_sql = """
    CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        age INT,
        email VARCHAR(150) UNIQUE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    """
    cursor.execute(create_table_sql)
    print("表创建成功或已存在。")

def insert_data(cursor, connection, data):
    """插入数据"""
    sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)"
    cursor.execute(sql, data)
    connection.commit()
    print(f"插入一条数据,ID: {cursor.lastrowid}")

def query_data(cursor):
    """查询数据"""
    sql = "SELECT id, name, age, email FROM users WHERE age > %s"
    cursor.execute(sql, (25,))
    results = cursor.fetchall()
    print("查询结果:")
    for row in results:
        print(row)

def update_data(cursor, connection, user_id, new_age):
    """更新数据"""
    sql = "UPDATE users SET age = %s WHERE id = %s"
    cursor.execute(sql, (new_age, user_id))
    connection.commit()
    print(f"更新ID为{user_id}的用户年龄为{new_age}")

def delete_data(cursor, connection, user_id):
    """删除数据"""
    sql = "DELETE FROM users WHERE id = %s"
    cursor.execute(sql, (user_id,))
    connection.commit()
    print(f"删除ID为{user_id}的用户")

def main():
    try:
        # 连接到MySQL服务器
        connection = pymysql.connect(**config)
        with connection.cursor() as cursor:
            # 创建数据库
            create_database(cursor)
            
            # 使用刚创建的数据库
            connection.select_db('test_db')
            
            # 创建表
            create_table(cursor)
            
            # 插入数据
            users = [
                ('张三', 28, 'zhangsan@example.com'),
                ('李四', 34, 'lisi@example.com'),
                ('王五', 23, 'wangwu@example.com')
            ]
            for user in users:
                insert_data(cursor, connection, user)
            
            # 查询数据
            print("\n所有用户信息:")
            query_data(cursor)
            
            # 更新数据
            update_data(cursor, connection, 1, 29)
            
            # 查询更新后的数据
            print("\n更新后的用户信息:")
            query_data(cursor)
            
            # 删除数据
            delete_data(cursor, connection, 2)
            
            # 查询删除后的数据
            print("\n删除后的用户信息:")
            query_data(cursor)
    
    except pymysql.MySQLError as e:
        print(f"发生错误: {e}")
    finally:
        if 'connection' in locals() and connection.open:
            connection.close()
            print("\n数据库连接已关闭。")

if __name__ == "__main__":
    main()

四、使用上下文管理器简化连接和游标管理

为了简化代码和提高可读性,可以使用上下文管理器(with语句)来自动管理数据库连接和游标。

import pymysql

connection_params = {
    'host': 'localhost',
    'user': 'your_username',
    'password': 'your_password',
    'database': 'test_db',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
}

sql_insert = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)"
data = ('王五', 25, 'wangwu@example.com')

with pymysql.connect(**connection_params) as connection:
    with connection.cursor() as cursor:
        cursor.execute(sql_insert, data)
    connection.commit()

五、处理事务

事务是确保数据库操作原子性、一致性、隔离性和持久性(ACID)的重要机制。PyMySQL支持事务管理,可以通过commit()和rollback()方法来控制事务。

import pymysql

connection_params = {
    'host': 'localhost',
    'user': 'your_username',
    'password': 'your_password',
    'database': 'test_db',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
}

sql_insert = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)"
sql_update = "UPDATE users SET age = %s WHERE name = %s"

data_insert = ('赵六', 30, 'zhaoliu@example.com')
data_update = (31, '赵六')

try:
    with pymysql.connect(**connection_params) as connection:
        with connection.cursor() as cursor:
            cursor.execute(sql_insert, data_insert)
            cursor.execute(sql_update, data_update)
        connection.commit()  # 提交事务
except Exception as e:
    connection.rollback()  # 回滚事务
    print(f"发生错误: {e}")

六、使用ORM框架(推荐)

虽然直接使用SQL语句可以灵活地操作数据库,但对于复杂的项目,使用ORM(对象关系映射)框架可以提高开发效率和代码可维护性。SQLAlchemy是Python中一个强大的ORM框架,支持多种数据库,包括MySQL。

安装SQLAlchemy

pip install SQLAlchemy pymysql

使用SQLAlchemy连接MySQL

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

# 创建数据库引擎
engine = create_engine('mysql+pymysql://your_username:your_password@localhost/test_db?charset=utf8mb4')

# 创建基类
Base = declarative_base()

# 定义User模型
class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50))
    age = Column(Integer)
    email = Column(String(100))

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

# 创建表(如果不存在)
Base.metadata.create_all(engine)

# 添加新用户
new_user = User(name='孙七', age=27, email='sunqi@example.com')
session.add(new_user)
session.commit()

# 查询用户
users = session.query(User).filter(User.age > 25).all()
for user in users:
    print(user.name, user.age, user.email)

# 关闭会话
session.close()

七、最佳实践

​1、使用参数化查询:避免SQL注入攻击,使用参数化查询(如 %s 占位符)或ORM框架。

​2、管理连接池:对于高并发应用,使用连接池(如SQLAlchemy的连接池)来管理数据库连接。

3、​处理异常:建议使用 try-except 捕获并处理数据库操作中的异常,确保程序的健壮性。

​4、关闭连接:确保在操作完成后关闭数据库连接,释放资源。

​5、优化查询:编写高效的SQL查询,避免全表扫描和不必要的复杂查询。

6、事务管理:在执行插入、更新、删除操作后,需要调用 conn.commit() 提交事务。

八、总结

使用Python连接和操作MySQL数据库是数据采集、处理和存储中的常见需求。通过PyMySQL、mysql-connector-python等库,可以方便地执行CRUD操作;而使用ORM框架如SQLAlchemy,则可以提高开发效率和代码的可维护性。在实际应用中,结合具体需求选择合适的方法,并遵循最佳实践,可以确保数据库操作的效率和安全性。

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

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

相关文章

【华为OD机考】华为OD笔试真题解析(15)--异常的打卡记录

题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据,为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的手机打卡记录进行异常排查。 如果出现以下两种情况,则认为打卡异常…

Java实战:使用HttpClient实现图片下载与本地保存

在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求。其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都显得尤为重要。无论是社交媒体平台、电商平台,还是个人项目,能够高效地…

【实战】使用PCA可视化神经网络提取后的特征空间【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Python毕业设计选题:基于Python的社区爱心养老管理系统设计与实现_django

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 身体健康界面 公共书籍界面 借阅信息界面 归还…

Spring Boot整合WebSocket

目录 ?引言 1.WebSocket 基础知识 ?1.1 什么是 WebSocket? ?1.2 WebSocket 的应用场景 ?2.Spring Boot WebSocket 整合步骤 2.1 创建 Spring Boot 项目 2.2 添加 Maven 依赖 2.3 配置 WebSocket 2.4 创建 WebSocket 控制器 2.5 创建前端页面 引言 在…

Pycharm使用matplotlib出现的问题(1、不能弹出图表 2、图表标题中文不显示)

Pycharm使用matplotlib出现的问题 问题1:Pycharm调试时出现:AttributeError: module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? 排查原因:可能是由于matplotlib后端设置不正确或与运行环境不兼容引…

【PromptCoder】使用 package.json 生成 cursorrules

【PromptCoder】使用 package.json 生成 cursorrules 在当今快节奏的开发世界中,效率和准确性至关重要。开发者们不断寻找能够优化工作流程、帮助他们更快编写高质量代码的工具。Cursor 作为一款 AI 驱动的代码编辑器,正在彻底改变我们的编程方式。但如…

给博客添加基于百度地图的足迹页面

使用百度地图 api 做的足迹页面一段时间了,经过一番改造,目前已基本能够满足自己需求。 一、添加百度地图 添加百度地图基本思路就是6点: 申请百度AK适当位置添加百度地图容器引入百度地图 api创建地图实例设置地图中心点初始化地图 这里…

【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField

在Android开发当中,BuildConfig是一个非常有用的功能,它允许我们在构建过程中定义常量,并在运行时使用它们。But!!当我们从传统的Groovy DSL迁移到Kotlin DSL时或者被Android Studio坑的时候,有一些细微的差…

4个小时开发DeepSeek+baiduNaotu一键生成思维导图

一、引言 最近发现AI生成思维导图的解决方案普遍存在两个断层:用户需手动复制模型输出的JSON数据到脑图软件,且缺乏实时可视化反馈。基于日常使用的BaiduNaotu框架(其轻量级架构与简洁的UI设计已满足基础需求),我决定…

(21)从strerror到strtok:解码C语言字符函数的“生存指南2”

❤个人主页:折枝寄北的博客 ❤专栏位置:简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…

SpringBoot集成easy-captcha图片验证码框架

SpringBoot集成easy-captcha图片验证码框架 此项目已经很久未维护,如有更好的选择,建议使用更好的选择!!! 一、引言 验证码(CAPTCHA)是现代应用中防止机器人攻击、保护接口安全的核心手段之一。然而,从零开发验证码…

货车一键启动无钥匙进入手机远程启动的正确使用方法

一、移动管家货车无钥匙进入系统的使用方法 基本原理:无钥匙进入系统通常采用RFID无线射频技术和车辆身份识别码识别系统。车钥匙需要随身携带,当车钥匙靠近货车时,它会自动与货车的解码器匹配。开门操作:当靠近货车后&#xff0…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1.2.2倒排索引原理与分词器(Analyzer)1. 倒排索引:搜索引擎的基石1.1 正排索引 vs 倒排索引示例数据对比: 1.2 倒排索引核心结…

和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设

气象领域与农业、能源、交通、环境科学等国计民生关键领域紧密相连,发挥着不可替代的重要作用。人工智能技术的迅猛发展,为气象领域突破困境带来了新的契机。AI 技术能够深度挖掘气象大数据中蕴含的复杂信息,助力人类更精准地把握自然规律&am…

linux下java Files.copy 提示文件名过长

linux下java Files.copy 提示文件名过长问题排查 系统运行时执行文件拷贝的功能的时候出现了 文件名称过长的报错提示 查询过资料后整理出了每个操作系统支持最大的文件名称长度 每个操作系统现在的文件长度不一样 Linux的 /usr/include/linux/limits.h 中做出了说明 这些限制…

Metal学习笔记八:纹理

到目前为止,您已经学习了如何使用片段函数和着色器为模型添加颜色和细节。另一种选择是使用图像纹理,您将在本章中学习如何作。更具体地说,您将了解: • UV 坐标:如何展开网格,以便可以对其应用纹理。 • 纹…

Idea 和 Pycharm 快捷键

一、快捷键 二、Pycharm 中怎么切换分支 参考如下 如果在界面右下角 没有看到当前所在的分支,如 “Git:master” 3. 有了 4.

fody引用c++的dll合并后提示找不到

fody引用c的dll合并后提示找不到 解决方案&#xff1a; 在 FodyWeavers.xml 文件中添加配置 CreateTemporaryAssemblies‘true’ 官方文档&#xff1a;https://github.com/Fody/Costura <Weavers xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:noN…

初识flutter1

为什么使用flutter, 说直白一点,就是移动UI框架, 个人认为优势是: 1.一套代码adnroid 和ios 可以使用, 代码好维护 2.原生用户界面 3.开源、免费的 开发工具&#xff1a; 1.下载 java 包, 根据自己的电脑配置选择 官网下载: https://www.oracle.com/java/technologies/download…