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()
相关推荐
小白勇闯网安圈2 小时前
Django 响应对象、文件上传与类视图
数据库·django·sqlite
努力的小雨2 小时前
同一份 SQL 跑多套环境:Ksql 变量怎么用才安全
数据库
科技绘图3 小时前
快鲸GEO vs 传统AI搜索优化:全链路自动化与高效内容生产在转化闭环上的对比
数据库·人工智能·自动化
ltl3 小时前
数据库作为 LLM 记忆体:语义缓存、RAG 与一致性
数据库
ltl3 小时前
WAL 与崩溃恢复:ARIES 协议怎么跑通
数据库
ltl3 小时前
TEE 数据库:EnclaveDB、Oblivious 原语与机密 SQL
数据库
麻瓜code4 小时前
【Mysql】重新学一遍 SQL 执行顺序
数据库·sql
这个DBA有点耶5 小时前
数据库一体机架构演进:从硬件堆叠到软硬深度耦合
服务器·网络·数据库·硬件架构·运维开发·database·数据库架构
一只fish5 小时前
优化器架构对比:Oracle vs PostgreSQL vs MySQL
mysql·postgresql·oracle
安_6 小时前
RAG的向量数据库:为LLM提供语义搜索能力
数据库