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()
相关推荐
2501_9418059320 小时前
在大阪智能零售场景中构建支付实时处理与高并发顾客行为分析平台的工程设计实践经验分享
数据库
李慕婉学姐20 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
珠海西格电力21 小时前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
哈里谢顿21 小时前
记录一次sql优化记录
mysql
数据大魔方21 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
Chasing Aurora21 小时前
数据库连接+查询优化
数据库·sql·mysql·prompt·约束
倔强的石头_21 小时前
【金仓数据库】ksql 指南(六)—— 创建与管理用户和权限(KingbaseES 安全控制核心)
数据库
小熊officer1 天前
Python字符串
开发语言·数据库·python
渐暖°1 天前
JDBC直连ORACLE进行查询
数据库·oracle
萧曵 丶1 天前
Next-Key Lock、记录锁、间隙锁浅谈
数据库·sql·mysql·mvcc·可重复读·幻读