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()
相关推荐
橘颂TA5 小时前
【Linux】不允许你还不会——信号保存(3)
linux·服务器·网络·数据库
Chloeis Syntax5 小时前
MySQL初阶学习日记(6)--- 索引
数据库·学习·mysql
0和1的舞者5 小时前
《MyBatis 从入门到上手:超全基础操作 + XML 配置指南》
数据库·spring boot·学习·spring·mybatis·框架·开发
sky丶Mamba5 小时前
CentOS Stream 9安装MySQL
android·mysql·centos
jarreyer5 小时前
mysql常见指标计算笔记
数据库·mysql
风月歌5 小时前
小程序项目之使命召唤游戏助手源代码(java+vue+小程序+mysql)
java·mysql·小程序·毕业设计·源码
源代码•宸5 小时前
goframe框架签到系统项目(安装 redis )
服务器·数据库·经验分享·redis·后端·缓存·golang
5 小时前
TIDB——TIKV——分布式事务与MVCC
数据库·分布式·tidb·分布式数据库·tikv·
5 小时前
TIDB——TIKV——RocksDB
数据库·分布式·tidb·分布式数据库·