Python连接MySQL常用PyMySQL和mysql-connector-python,前者纯Python实现易部署,后者官方出品性能强兼容好;核心步骤包括连接、游标、执行、提交、关闭;选择依据项目需求与团队偏好。

Python连接MySQL数据库,通常我们会借助第三方库来实现。目前最主流且推荐的两个选择是
PyMySQL
mysql-connector-python
要让Python程序与MySQL数据库“对话”,核心步骤无外乎那么几步:建立连接、创建游标、执行SQL语句、处理结果、提交或回滚事务,最后关闭连接。下面我将分别用
PyMySQL
mysql-connector-python
使用 PyMySQL
PyMySQL
立即学习“Python免费学习笔记(深入)”;
安装 PyMySQL:
pip install PyMySQL
连接与操作示例:
import pymysql
# 数据库连接参数
DB_CONFIG = {
'host': 'localhost',
'port': 3306,
'user': 'your_username',
'password': 'your_password',
'database': 'your_database',
'charset': 'utf8mb4', # 确保支持emoji等字符
'cursorclass': pymysql.cursors.DictCursor # 返回字典形式的结果
}
def execute_query(query, params=None, fetch_one=False):
"""
一个简单的查询执行函数
"""
conn = None
try:
conn = pymysql.connect(**DB_CONFIG)
with conn.cursor() as cursor:
cursor.execute(query, params)
if query.strip().upper().startswith('SELECT'):
if fetch_one:
return cursor.fetchone()
return cursor.fetchall()
else:
conn.commit() # 非查询操作需要提交
return cursor.rowcount
except pymysql.Error as e:
print(f"数据库操作失败: {e}")
if conn:
conn.rollback() # 发生错误时回滚
return None
finally:
if conn:
conn.close()
# 示例:创建表
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"""
print(f"创建表结果: {execute_query(create_table_sql)}")
# 示例:插入数据
insert_sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
users_to_insert = [
("张三", "zhangsan@example.com"),
("李四", "lisi@example.com")
]
for user_data in users_to_insert:
print(f"插入数据结果: {execute_query(insert_sql, user_data)}")
# 示例:查询数据
select_sql = "SELECT id, name, email FROM users WHERE name = %s"
user_info = execute_query(select_sql, ("张三",), fetch_one=True)
print(f"查询到用户: {user_info}")
select_all_sql = "SELECT id, name, email FROM users"
all_users = execute_query(select_all_sql)
print(f"所有用户: {all_users}")
# 示例:更新数据
update_sql = "UPDATE users SET email = %s WHERE name = %s"
print(f"更新结果: {execute_query(update_sql, ('zhangsan_new@example.com', '张三'))}")
# 示例:删除数据
delete_sql = "DELETE FROM users WHERE name = %s"
print(f"删除结果: {execute_query(delete_sql, ('李四',))}")mysql-connector-python
安装 mysql-connector-python:
pip install mysql-connector-python
连接与操作示例:
import mysql.connector
from mysql.connector import Error
# 数据库连接参数
DB_CONFIG_CONNECTOR = {
'host': 'localhost',
'database': 'your_database',
'user': 'your_username',
'password': 'your_password',
# 'port': 3306, # 默认3306,可省略
'charset': 'utf8mb4' # 同样重要
}
def execute_query_connector(query, params=None, fetch_one=False):
"""
一个简单的查询执行函数 (使用mysql-connector-python)
"""
conn = None
try:
conn = mysql.connector.connect(**DB_CONFIG_CONNECTOR)
if conn.is_connected():
cursor = conn.cursor(dictionary=True) # 返回字典形式的结果
cursor.execute(query, params)
if query.strip().upper().startswith('SELECT'):
if fetch_one:
return cursor.fetchone()
return cursor.fetchall()
else:
conn.commit()
return cursor.rowcount
except Error as e:
print(f"数据库操作失败 (mysql-connector): {e}")
if conn:
conn.rollback()
return None
finally:
if conn and conn.is_connected():
cursor.close()
conn.close()
# 示例:创建表 (与PyMySQL示例相同,确保数据库中没有重复表)
create_table_sql_conn = """
CREATE TABLE IF NOT EXISTS products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2),
description TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"""
print(f"创建表结果 (connector): {execute_query_connector(create_table_sql_conn)}")
# 示例:插入数据
insert_sql_conn = "INSERT INTO products (name, price) VALUES (%s, %s)"
products_to_insert = [
("笔记本电脑", 8999.00),
("机械键盘", 599.50)
]
for product_data in products_to_insert:
print(f"插入数据结果 (connector): {execute_query_connector(insert_sql_conn, product_data)}")
# 示例:查询数据
select_product_sql_conn = "SELECT id, name, price FROM products WHERE name = %s"
product_info = execute_query_connector(select_product_sql_conn, ("笔记本电脑",), fetch_one=True)
print(f"查询到产品 (connector): {product_info}")
select_all_products_sql_conn = "SELECT id, name, price FROM products"
all_products = execute_query_connector(select_all_products_sql_conn)
print(f"所有产品 (connector): {all_products}")在Python生态中,连接MySQL确实有好几个选择,
PyMySQL
mysql-connector-python
PyMySQL
pip install PyMySQL
PyMySQL
PyMySQL
而
mysql-connector-python
mysql-connector-python
我自己的经验是,如果只是写一些数据分析脚本,或者开发一个简单的Flask/Django小应用,我通常会倾向于用
PyMySQL
mysql-connector-python
连接数据库这事儿,看起来简单,但实际操作中总会遇到一些意想不到的“坑”。我这就把一些我个人踩过的、或者经常看到别人踩的坑,以及对应的解决方案分享一下。
连接失败:Access denied for user...
user
password
'your_username'@'localhost'
'your_username'@'%'
%
GRANT ALL PRIVILEGES ON your_database.* TO 'your_username'@'your_ip_address' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES;
连接失败:Can't connect to MySQL server on '...' (111)
sudo systemctl status mysql
sudo service mysql status
host
port
sudo ufw allow 3306
iptables
ping
telnet your_mysql_host 3306
乱码问题:字符集不匹配
utf8mb4
charset='utf8mb4'
utf8mb4
SHOW VARIABLES LIKE 'character_set_database';
SHOW CREATE TABLE your_table_name;
SQL注入漏洞
问题描述: 如果你直接用字符串拼接的方式来构建SQL查询,比如
"SELECT * FROM users WHERE name = '" + username + "'"
解决方案:
%s
?
execute()
# 错误示例 (容易SQL注入)
# username = "admin' OR '1'='1"
# cursor.execute(f"SELECT * FROM users WHERE name = '{username}'")username = "admin" cursor.execute("SELECT * FROM users WHERE name = %s", (username,)) # PyMySQL/mysql-connector-python 常用 %s
资源泄露:忘记关闭连接和游标
conn.close()
cursor.close()
with
with
import pymysql
try:
conn = pymysql.connect(**DB_CONFIG)
with conn.cursor() as cursor: # 游标会自动关闭
# 执行数据库操作
cursor.execute("SELECT 1")
conn.commit() # 事务提交
except pymysql.Error as e:
if conn:
conn.rollback()
finally:
if conn:
conn.close() # 连接也需要手动关闭或在连接池中管理对于连接,如果使用连接池,则不需要手动关闭,而是将连接归还给连接池。
这些都是我在实际开发中经常碰到的问题,提前了解并采取预防措施,能省下不少调试时间。
在实际的Python应用,尤其是在Web服务或长时间运行的后台任务中,仅仅知道如何连接和执行查询是远远不够的。连接的管理,比如如何高效复用、如何安全存储凭证、如何处理异常,这些都直接影响到应用的性能、稳定性和安全性。我个人在构建系统时,会特别关注以下几个方面,让数据库连接的管理变得更“优雅”。
连接池(Connection Pooling):性能与资源复用的基石
为什么需要它? 每次建立数据库连接都有不小的开销,包括TCP握手、身份验证等。在高并发场景下,频繁地创建和销毁连接会显著降低应用性能,并可能耗尽数据库服务器的连接资源。连接池就是为了解决这个问题而生。
工作原理: 连接池维护了一组预先建立好的数据库连接。当应用需要连接时,它从池中“借用”一个连接;当操作完成后,连接会被“归还”到池中,而不是真正关闭。这样就大大减少了连接建立和关闭的开销。
如何实现?
许多Web框架(如Django、SQLAlchemy)都内置或提供了连接池的集成。
对于纯DB-API的使用,可以使用像
DBUtils
PyMySQL示例(使用DBUtils的PooledDB):
from DBUtils.PooledDB import PooledDB
import pymysql
DB_CONFIG_POOL = {
'host': 'localhost',
'port': 3306,
'user': 'your_username',
'password': 'your_password',
'database': 'your_database',
'charset': 'utf8mb4',
'cursorclass': pymysql.cursors.DictCursor
}
# 创建连接池,mincached表示启动时创建的最小连接数,maxcached表示最多可缓存的连接数
# maxconnections表示允许的最大连接数,blocking表示当连接池满时是否阻塞等待
POOL = PooledDB(pymysql, mincached=5, maxcached=10, maxconnections=20, blocking=True, **DB_CONFIG_POOL)
def get_pooled_connection():
return POOL.connection()
# 示例使用
def query_with_pool(sql, params=None):
conn = None
try:
conn = get_pooled_connection() # 从池中获取连接
with conn.cursor() as cursor:
cursor.execute(sql, params)
if sql.strip().upper().startswith('SELECT'):
return cursor.fetchall()
else:
conn.commit()
return cursor.rowcount
except pymysql.Error as e:
print(f"数据库操作失败 (带连接池): {e}")
if conn:
conn.rollback()
return None
finally:
if conn:
conn.close() # 归还连接到池中,而不是真正关闭我个人觉得,在任何需要处理并发请求的应用中,连接池都是一个必须考虑的组件。它能极大地提升应用的响应速度和资源利用率。
配置管理:安全与灵活性的平衡
以上就是Python怎么连接MySQL数据库_PyMySQL与mysql-connector-python使用教程的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号