1. 环境准备与依赖安装
1.1 MySQL 服务端与客户端工具安装
核心目标:在本地或服务器上搭建可连通的 MySQL 实例,并具备基本客户端工具。
要点:选择合适的版本、下载官方安装包、完成初始配置,确保服务运行。
在 Linux 上常用的安装步骤如下,确保你具备管理员权限,并且知道如何管理服务。
sudo apt-get update
sudo apt-get install mysql-server
sudo systemctl start mysql
sudo systemctl enable mysql
1.2 数据库用户与权限配置
安全性要点:不要使用 root 账号进行应用访问,创建专用账号并授予最小权限。
通过 SQL 配置一个应用用户并授权,对应你的数据库名,确保仅有必要的操作权限。
CREATE USER 'app'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app'@'localhost';
FLUSH PRIVILEGES;
注意:在生产环境,需考虑对外访问控制、密钥管理和网络防火墙策略。
2. Python 环境与驱动安装
2.1 创建虚拟环境并安装驱动
最佳实践:使用虚拟环境进行依赖隔离,避免与系统级依赖冲突。
要点:Python 生态中常见的两种驱动是官方的 mysql-connector-python 与第三方 PyMySQL,选择时要考虑官方支持与性能需求。
以下是常用的虚拟环境与驱动安装步骤示例。
# 使用虚拟环境
python3 -m venv venv
source venv/bin/activate # Linux/macOS
venv\Scripts\activate # Windows
# 安装驱动
pip install mysql-connector-python
# 或者
pip install PyMySQL
2.2 驱动选择与对比
选择依据:若需要官方支持与稳定性,优先选择 mysql-connector-python;若偏好纯 Python 实现与简单易用性,可以考虑 PyMySQL。
兼容性:确保所选驱动与当前 Python 版本、MySQL 版本兼容,并关注对应驱动的文档更新。
3. 使用 Python 连接 MySQL 的基础示例
3.1 基于 mysql-connector-python 的连接实现
核心步骤:建立连接对象后,通过游标执行 SQL。
要点:保持连接信息安全,避免在源码中硬编码敏感信息,尽量通过环境变量管理。
下面给出一个最简单的连接模板,适合初学者理解流程。
import mysql.connector
# 使用实际的主机、用户、密码和数据库替换以下字段
cnx = mysql.connector.connect(
user='app',
password='strong_password',
host='127.0.0.1',
database='mydb'
)
cursor = cnx.cursor()
3.2 运行简单查询并获取结果
查询语句:通过游标执行简单查询,避免在生产环境直接暴露敏感信息。
示例查询服务器版本信息,作为连接是否成功的简单验证。
cursor.execute("SELECT VERSION()")
row = cursor.fetchone()
print("MySQL 版本:", row[0])
重要:查询结束后,请按规范关闭游标与连接以释放资源。
cursor.close()
cnx.close()
4. 参数化查询与防注入
4.1 使用参数化查询避免 SQL 注入
原因:直接拼接字符串容易导致 SQL 注入风险,参数化查询可以自动处理转义。
要点:在 mysql-connector-python 中,使用占位符 %s 搭配元组传参。
# 参数化查询示例
cursor = cnx.cursor()
user_id = 42
query = "SELECT * FROM users WHERE id = %s"
cursor.execute(query, (user_id,))
rows = cursor.fetchall()
print(rows)
4.2 插入数据的参数化示例
正确做法是使用参数化来传递数据,避免将数据直接拼接到 SQL 字符串中。
insert_sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
values = ("Alice", "alice@example.com")
cursor.execute(insert_sql, values)
cnx.commit()
print("新记录已插入,ID:", cursor.lastrowid)
5. 连接管理与资源释放
5.1 异常处理与回滚
稳健性:在数据库操作中应对异常进行捕获,必要时执行回滚以保持数据一致性。
要点:使用 try-except-finally 结构,确保资源最终被释放,避免连接泄漏。
try:
cnx = mysql.connector.connect(user='app', password='strong_password', host='127.0.0.1', database='mydb')
cursor = cnx.cursor()
cursor.execute("UPDATE accounts SET balance = balance - 10 WHERE id = %s", (1,))
cnx.commit()
except Exception as e:
if cnx:
cnx.rollback()
print("发生错误:", e)
finally:
if cursor:
cursor.close()
if cnx:
cnx.close()
5.2 正确关闭连接与资源释放
要点:无论操作是否成功,都应确保数据库连接被关闭,以避免连接泄漏。
可以将连接与游标的创建和关闭封装在函数中,简化调用与错误处理。
def run_query():
cnx = None
try:
cnx = mysql.connector.connect(user='app', password='strong_password', host='127.0.0.1', database='mydb')
cursor = cnx.cursor()
cursor.execute("SELECT * FROM users LIMIT 5")
return cursor.fetchall()
finally:
if 'cursor' in locals() and cursor:
cursor.close()
if 'cnx' in locals() and cnx:
cnx.close()
print(run_query())
6. 进一步优化与常见问题
6.1 使用连接池提升并发性能
连接池可以复用数据库连接,降低建立连接的耗时,从而提升并发性能。
简单示例:MySQL Connector 提供了连接池选项,适用于多线程或高并发场景。
import mysql.connector
from mysql.connector import pooling
dbconfig = {
"user": "app",
"password": "strong_password",
"host": "127.0.0.1",
"database": "mydb"
}
cnxpool = pooling.MySQLConnectionPool(pool_name="mypool",
pool_size=5,
**dbconfig)
cnx = cnxpool.get_connection()
cursor = cnx.cursor()
cursor.execute("SELECT NOW()")
print(cursor.fetchone())
cursor.close()
cnx.close()
6.2 常见错误排查清单
排查点:确认主机、端口、用户名、密码正确,数据库是否存在,以及网络连通性是否正常。
日志与诊断:开启驱动日志、查看 MySQL 服务器日志有助于快速定位问题。


