一、三种不同的连接方式
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()