百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

PyMySQL 快速上手:用 Python 轻松玩转数据库

bigegpt 2025-03-30 14:32 8 浏览

pyMySQL是一个纯Python编写的MySQL 客户端库,它兼容 MySQLdb1,并且易于安装和使用。本文将详细介绍如何使用PyMySQL 连接、操作MySQL数据库。

1. 安装 PyMySQL

使用 pip 安装 PyMySQL:

pip install pymysql

2. 连接数据库

在使用 PyMySQL 操作数据库之前,需要先建立与数据库的连接。以下是连接数据库的基本步骤:

import pymysql# 数据库连接参数db_config = {    'host': 'localhost',  # 数据库主机地址 如果自己的改了名称,需要改成自己的    'port': 3306,         # 数据库端口,默认为 3306    'user': 'your_user',  # 数据库用户名 要改成自己的    'password': 'your_password',  # 数据库密码 要改成自己的    'database': 'your_database',  # 要连接的数据库名 要改成自己的    'charset': 'utf8mb4'# 字符集,建议使用 utf8mb4 以支持 Emoji 表情等}try:    # 建立数据库连接    connection = pymysql.connect(**db_config)    # 创建游标对象    with connection.cursor() as cursor:        # 在此处执行 SQL 查询或操作        print("成功连接到数据库!")    # 关闭数据库连接 (with 语句块会自动处理)    # connection.close()except pymysql.MySQLError as e:    print(f"数据库连接错误: {e}")

代码解释:

  • db_config 字典: 存储数据库连接所需的参数。根据你的实际情况修改这些参数。
  • pymysql.connect(**db_config): 使用 connect() 函数建立数据库连接。 **db_config 会将字典解包为关键字参数。
  • connection.cursor(): 创建一个游标对象。游标用于执行 SQL 语句并获取结果。
  • with connection.cursor() as cursor:: 使用 with 语句可以确保在代码块结束后自动关闭游标,即使发生异常也能保证资源被正确释放。这是一个良好的编程习惯。
  • try...except 块: 捕获并处理数据库连接过程中可能出现的错误 (如用户名/密码错误、数据库不存在等)。
  • connection.close(): 当你使用with语句时, 可以不需要手动关闭数据库连接.

3. 执行 SQL 语句

连接成功后,可以使用游标对象执行各种 SQL 语句,包括:

  • 查询 (SELECT)
  • 插入 (INSERT)
  • 更新 (UPDATE)
  • 删除 (DELETE)
  • 创建表 (CREATE TABLE)
  • 删除表 (DROP TABLE)
  • ...等等

3.1 创建表 (CREATE TABLE)

with connection.cursor() as cursor:    # 创建表的 SQL 语句 (如果表不存在)    create_table_sql = """    CREATE TABLE IF NOT EXISTS your_table (        id INT AUTO_INCREMENT PRIMARY KEY,        column1 VARCHAR(255),        column2 INT,        column3 INT    )    """    cursor.execute(create_table_sql)    print("表 'your_table' 创建成功 (或已存在)")    # 提交更改 (对于 DDL 语句,如 CREATE TABLE,通常也需要提交)    connection.commit()

代码解释:

  • CREATE TABLE IF NOT EXISTS your_table (...): 创建表的 SQL 语句。
    • IF NOT EXISTS 子句确保只有当表不存在时才创建,避免重复创建导致错误。
    • id INT AUTO_INCREMENT PRIMARY KEY:创建一个名为 id 的整数类型列,设置为自动递增的主键。
    • column1 VARCHAR(255) NOT NULL:创建一个名为 column1 的字符串类型列,最大长度为 255,且不能为空。
    • column2 INT:创建一个名为 column2 的整数类型列。
    • column3 DATE:创建一个名为 column3 的日期类型列。
  • cursor.execute(create_table_sql): 执行创建表的语句
  • connection.commit(): 提交更改。虽然 CREATE TABLE 通常会自动提交,但显式调用 commit() 是一个好习惯,可以确保更改被保存。

3.2 插入数据 (INSERT)

with connection.cursor() as cursor:    # 执行 SQL 插入    sql = "INSERT INTO your_table (column1,column2,column3) VALUES (%s,%s,%s)"    data = [(11, 12,12333), (21, 22,22222), (1,2,3)]                cursor.executemany(sql, data)    # 提交事务 (重要!)    connection.commit()    print(f"{cursor.rowcount} 行数据插入成功!")  # cursor.rowcount 返回受影响的行数

我们可以看看数据:

代码解释:

  • cursor.executemany(sql,data): 执行了插入多行数据的SQL语句
  • connection.commit(): 非常重要! 对于修改数据的操作 (INSERT, UPDATE, DELETE),必须调用 connection.commit() 来提交事务,否则更改不会保存到数据库中。

3.3 查询数据 (SELECT)

with connection.cursor() as cursor:    # 执行 SQL 查询    sql = "SELECT * FROM your_table WHERE column1 = %s"    cursor.execute(sql, (11,))  # 使用参数化查询,防止 SQL 注入    # 获取查询结果    # 1. 获取所有结果    results = cursor.fetchall()    for row in results:        print(row)  # row 是一个元组,对应一行数据    # 2. 获取一行结果    # result = cursor.fetchone()    # print(result)    # 3. 获取指定数量的结果    # results = cursor.fetchmany(5)  # 获取前 5 行    # print(results)
  • cursor.execute(sql, params): 执行 SQL 查询。
    • sql: 要执行的 SQL 语句。
    • params: (可选) 一个元组或列表,包含要替换 SQL 语句中占位符 (%s) 的值。强烈建议使用参数化查询,这可以防止 SQL 注入攻击,并提高安全性。
  • cursor.fetchall(): 获取所有查询结果。返回一个包含元组的列表,每个元组代表一行数据。
  • cursor.fetchone(): 获取下一行查询结果。如果没有更多行,则返回 None。
  • cursor.fetchmany(size): 获取指定数量的查询结果。

3.4 更新数据 (UPDATE)

with connection.cursor() as cursor:    # 执行 SQL 更新    sql = "UPDATE your_table SET column2 = %s WHERE column1 = %s"    data = (1000, 11)#把column1列数据为11的行其对应的column2更新为1000    cursor.execute(sql, data)    # 提交事务    connection.commit()    print(f"{cursor.rowcount} 行数据更新成功!")

我们看看数据库更新完后的结果。

3.5 删除数据 (DELETE)

with connection.cursor() as cursor:    # 执行 SQL 删除    sql = "DELETE FROM your_table WHERE column1 = %s"    data = (11,)    cursor.execute(sql, data)    # 提交事务    connection.commit()    print(f"{cursor.rowcount} 行数据删除成功!")

3.6 使用字典游标 (DictCursor)

默认情况下,cursor.fetchall() 返回的结果是元组的列表。如果希望以字典的形式获取结果(键是列名,值是对应的数据),可以使用 DictCursor:

import pymysql.cursors# 创建游标对象connection = pymysql.connect(**db_config)with connection.cursor(pymysql.cursors.DictCursor) as cursor:    sql = "SELECT * FROM your_table"    cursor.execute(sql)    results = cursor.fetchall()    for row in results:        print(row['column1'], row['column2'])  # 通过列名访问数据

需要注意的是, connection需要重新声明

# 创建游标对象connection = pymysql.connect(**db_config)with connection.cursor(pymysql.cursors.DictCursor) as cursor:   #...

4. 事务处理

在数据库操作中,事务用于确保一组操作要么全部成功,要么全部失败,以保持数据的一致性。

try:    with connection.cursor() as cursor:        # 开始事务        connection.begin()        # 执行多个 SQL 操作        cursor.execute("INSERT ...")        cursor.execute("UPDATE ...")        cursor.execute("DELETE ...")        # 提交事务 (如果所有操作都成功)        connection.commit()except pymysql.MySQLError as e:    # 回滚事务 (如果发生错误)    connection.rollback()    print(f"事务执行失败: {e}")

解释:

  • connection.begin(): 显式开始一个事务。虽然在上面的 INSERT, UPDATE, DELETE 示例中没有显式调用,但 PyMySQL 默认会为每个连接开启一个事务。connection.commit() 实际上提交的是这个隐式事务。
  • connection.commit(): 提交事务。如果事务中的所有操作都成功执行,则将更改永久保存到数据库。
  • connection.rollback(): 回滚事务。如果在事务执行过程中发生错误,则撤销所有已执行的操作,将数据库恢复到事务开始之前的状态。

5. 预防 SQL 注入

SQL 注入是一种常见的安全漏洞,攻击者可以通过构造恶意的输入来执行未经授权的 SQL 代码。务必使用参数化查询来防止 SQL 注入

错误示例 (易受 SQL 注入攻击):

# 危险! 不要这样做!user_input = input("请输入用户名: ")sql = f"SELECT * FROM users WHERE username = '{user_input}'"  # 直接拼接字符串cursor.execute(sql)

如果用户输入 '; DROP TABLE users; --, 那么最终执行的 SQL 语句将变成:

SELECT * FROM users WHERE username = ''; DROP TABLE users; --'

这将导致 users 表被删除!

正确示例 (使用参数化查询):

user_input = input("请输入用户名: ")sql = "SELECT * FROM users WHERE username = %s"cursor.execute(sql, (user_input,))  # 使用参数化查询,将用户输入作为参数传递

使用参数化查询时,PyMySQL 会负责对参数进行正确的转义和处理,确保 SQL 语句的安全性。

6. 完整示例举例 (创建表、插入、查询)

import pymysqldb_config = {    'host': 'your_host',    'port': 3306,    'user': 'your_user',    'password': 'your_password',    'database': 'your_database',    'charset': 'utf8mb4'}try:    connection = pymysql.connect(**db_config)    with connection.cursor() as cursor:        # 创建表 (如果不存在)        create_table_sql = """        CREATE TABLE IF NOT EXISTS employees (            id INT AUTO_INCREMENT PRIMARY KEY,            name VARCHAR(255) NOT NULL,            age INT,            department VARCHAR(255)        )        """        cursor.execute(create_table_sql)        print("表 'employees' 创建成功 (或已存在)")        # 插入数据        insert_data = [            ('Alice', 30, 'Sales'),            ('Bob', 25, 'Marketing'),            ('Charlie', 35, 'Engineering')        ]        insert_sql = "INSERT INTO employees (name, age, department) VALUES (%s, %s, %s)"        cursor.executemany(insert_sql, insert_data)  # executemany 用于批量插入        connection.commit()        print(f"{cursor.rowcount} 行数据插入成功!")        # 查询数据        select_sql = "SELECT * FROM employees"        cursor.execute(select_sql)        results = cursor.fetchall()        print("\n查询结果:")        for row in results:            print(row)except pymysql.MySQLError as e:    print(f"数据库操作错误: {e}")finally:if connection:    connection.close()

这个示例演示了如何创建表、批量插入数据以及查询数据。cursor.executemany() 方法用于一次性插入多行数据,这比循环执行多次 cursor.execute() 更高效。 finally 块确保无论是否发生异常,数据库连接都会被关闭。

总结

PyMySQL 提供了一套简单易用的 API 来操作 MySQL 数据库。通过本文的学习,你应该掌握了以下内容:

  • 安装 PyMySQL
  • 连接数据库
  • 执行各种 SQL 语句 (SELECT, INSERT, UPDATE, DELETE, CREATE TABLE)
  • 使用参数化查询防止 SQL 注入
  • 获取查询结果 (fetchall, fetchone, fetchmany)
  • 使用 DictCursor 获取字典形式的结果
  • 事务处理 (commit, rollback)
  • 批量插入

希望这篇文章能帮助大家更好地理解和使用 PyMySQL 操作 MySQL 数据库。

相关推荐

Linux 命令 ncftp(文件传输)——想玩转linux就请一直看下去

我是IT悟道,点击右上方“关注”,每天分享IT、科技、数码方面的干货。Linuxncftp命令Linux命令大全Linuxncftp命令用于传输文件。FTP让用户得以下载存放于服务器主机的文件,...

玩转 Linux 之:磁盘分区、挂载知多少?

今天来聊聊linux下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普!!1、Linux分区简介1.1主分区vs扩展分区硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两...

一文带你了解 Linux 文件权限,从基础到高级

在Linux中,每个文件和目录都关联了一组权限,定义了不同用户对其的访问能力。权限分为三类:读取(read,r)、写入(write,w)和执行(execute,x),分别用字母r、w、x...

Linux 使用 socat 让云服务器作为跳板机的方法

概念三台机器:客户端A(192.168.1.11)服务器B(192.168.1.88)跳板机C(192.168.1.32)实现A与B的双向数据传输,本该这样:A<...

Linux启动流程之ROM-CODE(linux启动详解)

1.从哪里开始?下图是AM335X核心板和功能框图:AM335X核心板的存储信息如下:AM335X核心板运行linux系统,在这里提出一个问题:上电后指令从哪里开始执行?DDRorEMMC?2....

「Linux」——select和epoll详解(linux epoll详解)

select和epoll详解select和epoll的区别(面试常考)select一、什么是select1.select函数原型2.参数解释3.参数timeout取值4.返回值5.监控原理二、sele...

Linux中使用输入输出和错误重定向, 赶紧收藏!

Linux中的每个进程都提供三个打开的文件(通常称为文件描述符),分别是标准的输入、输出和错误文件。StandardInput是键盘,抽象为文件,使编写脚本和程序更容易。StandardOut...

「正点原子Linux连载」第七十一章Linux 4G通信实验

1)实验平台:正点原子Linux开发板2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号,获取更多资料:正点原子第七十一章Linux4G通信实验前面我们学习了如何在Li...

LSM Oops 内存错误根因分析与解决

作者简介:吴文涵,图形算法出身,同时热爱linux内核开发的工程师,喜欢推导并乐于分享。版权声明:本文最先发表于“泰晓科技”微信公众号,欢迎转载,转载时请在文章的开头保留本声明。Oops是...

连你家电器的算力都不放过,新发现Linux恶意软件用IoT设备挖矿

萧箫发自凹非寺量子位|公众号QbitAI继电脑和手机后,挖矿病毒也盯上了IoT设备。无论是智能冰箱、彩电还是洗衣机,但凡有点算力的(物联网和端侧)设备都可能被这种病毒感染,用于挖掘加密货币等...

Linux-AT命令干货分享,还不赶紧收藏!

苹果iOS 26锁屏大升级:更个性更沉浸 有五大亮点

【CNMO科技消息】CNMO注意到,苹果近日在iOS26开发者预览版中推出了多项锁屏界面创新功能,可以大幅提升用户个性化设置与操作便捷性。这些更新不仅优化了视觉体验,还通过技术手段增强了交互效率,为...

福彩 3D 第 2025178 期:心水407 !大小奇偶双平衡 + 跨度适配,速收藏

福彩3D第2025178期:497后和值回落!五维分析+形态调整策略福彩3D2025177期开奖号码497,组六形态,大小比2:1,奇偶比1:2,和值20,跨度5。面对大...

一加 Ace5 至尊版手机首发适配和平精英手游

7月8日消息,据用户反馈,一加Ace5至尊版手机开启新版本系统推送,升级包大小约6.83MB、版本号为15.0.2.215(CN01),适配了腾讯《和平精英》手游144Hz高刷。IT...

外媒称苹果今年秋季将推出超15款新品 远不止iPhone 17

【CNMO科技消息】2025年已过半程,有外媒指出苹果计划在今年秋季推出超过15款新产品,涵盖iPhone革新、M5芯片设备迭代、可穿戴设备升级及智能家居布局等。苹果1.iPhone17系列:产品...