MySQL在python中的使用——连接方式及对对象的调用

一、三种不同的连接方式

1、mysql-connector-python(Oracle官方)

在考虑到项目稳定性和特性的时候,可与选择使用此连接方式

python 复制代码
import mysql.connector
from mysql.connector import Error

def connect_with_mysql_connector():
    try:
        connection = mysql.connector.connect(
            host='localhost',
            user='username',
            password='password',
            database='database_name',
            port=3306
        )
        
        if connection.is_connected():
            print("连接成功")
            return connection
            
    except Error as e:
        print(f"连接失败: {e}")
        return None

# 使用连接
conn = connect_with_mysql_connector()

2、PyMySQL(纯Python实现)

此连接方式适用于简单项目或者说原型开发

python 复制代码
import pymysql

# 支持字典游标
def connect_with_pymysql():
    try:
        connection = pymysql.connect(
            host='localhost',
            user='username',
            password='password',
            database='database_name',
            port=3306,
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor  # 返回字典格式
        )
        print("连接成功")
        return connection
    except Exception as e:
        print(f"连接失败: {e}")
        return None
# 异步支持示例
# import aiomysql
# async with aiomysql.connect() as conn:
#     async with conn.cursor() as cursor:
#         await cursor.execute("SELECT 1")

3、mysqlclient(C扩展)

这种方法在安装的包的时候可能会遇到问题,不同的系统安装的包差异性较大。

在使用的过程中如果是使用Django默认使用此连接,如果是使用Flask则要视需求而定:简单项目使用PyMySQL,复杂高性能项目使用mysqlclient。

python 复制代码
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker

# 创建连接引擎
def create_engine_connection():
    # 格式:mysql+驱动://用户名:密码@主机:端口/数据库名
    connection_string = "mysql+pymysql://username:password@localhost:3306/database_name"
    
    engine = create_engine(
        connection_string,
        echo=True,  # 显示SQL语句
        pool_size=5,  # 连接池大小
        pool_recycle=3600  # 连接回收时间
    )
    return engine

# 创建会话
engine = create_engine_connection()
Session = sessionmaker(bind=engine)
session = Session()
特性 mysql-connector-python PyMySQL mysqlclient
官方支持 Oracle官方维护 社区维护 社区维护(C扩展)
依赖 纯Python 纯Python 需要C编译器
性能 中等 中等 最好(C扩展)
安装难度 简单 简单 可能有依赖问题
Python3兼容
异步支持
连接池 内置 需第三方 需第三方
流行度 很高 中等

二、mysql连接对象的使用

1、连接对象的通用属性

属性或方法名
数据库服务器 conn.server_port
数据库名称 conn.database
用户 conn.user
判断是否已经连接 conn.is_sonnected()
连接ID conn.connection_id
连接对象的字符集 conn.charset
编码 conn.encoding
自动提交模式 conn.autocommit
连接超时时间 conn.connect_timeout

2、调用游标进行使用

游标:数据库查询结果的控制指针,能够逐行遍历查询结果、对结果集进行CRUD操作、控制数据访问的位置和方向。以下是游标按照功能特性进行分类的表格:

游标类型 内存使用 适用场景 Python示例
客户端游标 高(全加载) 小结果集 cursor()
服务器端游标 低(逐行) 大数据集 cursor(buffered=False)
字典游标 同客户端 需要列名访问 cursor(dictionary=True)
预编译游标 中等 重复查询 cursor(prepared=True)

在使用游标的时候需要了解其核心属性和方法:

|-----------------------------------|--------------------------------------|
| 游标属性和方法 | 含义 |
| cursor.descripition | 游标的描述信息,可按列进行提取 |
| cursor.rowcount | 游标的影响行数 |
| cursor.lastrowid | 最后插入的ID |
| getattr(cursor, 'name', '未命名') | 游标的名称 |
| cursor.closed | 游标是否已关闭 |
| cursor.execute(SQL语句) | 在执行这个执行语句之后,可以通过下面的方法进行游标的移动从而获取其他内容 |
| fetchone()、fetchmany()、fetchall() | 获取查询结果的第一条、获取多行查询结果、获取所有的查询结果 |
| 使用for语句进行迭代 | |

3、使用示例

python 复制代码
# 该函数根据ID更改数据库表的信息,更改成功返回True,没有更改返回False
def cancel_leave_request(leave_id: str) -> bool:
    with get_conn() as conn:
        with conn.cursor() as cur:
            cur.execute(
                "UPDATE leave_requests SET status='CANCELLED' WHERE leave_id=%s AND status='PENDING'",
                (leave_id,)
            )
            return cur.rowcount > 0
# 该函数返回查询到的第一条结果,如果想要所有结果可以改写成fetchall()函数
def get_leave_request(leave_id: str) -> dict | None:
    with get_conn() as conn:
        with conn.cursor() as cur:
            cur.execute("SELECT * FROM leave_requests WHERE leave_id=%s", (leave_id,))
            return cur.fetchone()
相关推荐
泡干脆面就番茄1 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
devpotato2 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情6732 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
wxwx_bscxy3223 小时前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物
九月要晚安3 小时前
达梦DW与AFC对比
数据库
实战派K8S&DB3 小时前
如何在内网配置 TiDB 数据库 Agent
数据库·人工智能·分布式·tidb
实战派K8S&DB4 小时前
《基于 Dify + FastAPI + PyTiDB 搭建大模型驱动的 TiDB 智能运维 Agent》
运维·数据库·分布式·云原生·tidb·fastapi
SelectDB4 小时前
Apache Doris 5.0 年度版本前瞻(一):构建统一的多模湖仓实时分析平台
大数据·数据库·数据分析
小白学大数据4 小时前
超简单:用 Python 让 Excel 飞起来:用 openpyxl 把重复报表整理交给脚本
开发语言·数据库·python·excel
西索斯coding4 小时前
doubao-seed-2.1-turbo 调用一直 401 怎么办?pro 版同样的 Key 却正常——5 分钟排查定位指南
java·服务器·数据库·ai