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()
相关推荐
未来之窗软件服务9 小时前
计算机等级考试—KTV 管理系统数据流图大题—东方仙盟练气期
数据库·计算机软考·仙盟创梦ide·东方仙盟
云草桑9 小时前
.net AI开发04 第八章 引入RAG知识库与文档管理核心能力及事件总线
数据库·人工智能·microsoft·c#·asp.net·.net·rag
diediedei9 小时前
机器学习模型部署:将模型转化为Web API
jvm·数据库·python
m0_561359679 小时前
使用Python自动收发邮件
jvm·数据库·python
天空属于哈夫克39 小时前
企业微信外部群运营升级:API 主动推送消息开发实战
java·数据库·mysql
naruto_lnq10 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
星火开发设计10 小时前
共用体 union:节省内存的特殊数据类型
java·开发语言·数据库·c++·算法·内存
Genie cloud10 小时前
外贸独立站建站完整教程
服务器·数据库·云计算
2301_8223650310 小时前
数据分析与科学计算
jvm·数据库·python
brave_zhao10 小时前
达梦数据库导出表结构语句(很好用)(在达梦工具上可执行)
数据库