广告

Python连接MySQL数据库入门教程:从环境配置到简单查询的完整指南

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 服务器日志有助于快速定位问题。

广告

后端开发标签