Python连接MySQL通常使用PyMySQL库,它通过提供接口实现数据增删改查,建立连接需安装库、配置参数、创建游标、执行SQL、提交事务并关闭连接;推荐使用环境变量或配置文件管理数据库凭证以提升安全性,避免硬编码;PyMySQL为纯Python实现,兼容Python 3且安装简便,相较MySQLdb更适用于现代项目;处理中文时应设置charset='utf8mb4'防止乱码,并利用DictCursor返回字典形式结果;常见问题如连接失败需检查网络、权限、用户名密码及端口,SQL错误则需验证语法、表名、列名和数据类型;事务管理需手动关闭自动提交,通过commit()提交或rollback()回滚以保证数据一致性;防范SQL注入必须使用参数化查询,禁止字符串拼接SQL。

Python连接MySQL数据库,通常我们会借助专门的数据库连接库,比如非常流行的
PyMySQL
在Python项目里使用PyMySQL连接MySQL数据库,其实并没有想象中那么复杂。我们通常会分几步走:先是安装库,然后建立连接,接着创建游标来执行SQL语句,处理完数据后别忘了提交更改或者回滚,最后关闭连接。
首先,你得确保你的Python环境里安装了
PyMySQL
pip
pip install PyMySQL
安装好了之后,就可以开始写代码了。一个基本的连接和操作流程大概是这样:
立即学习“Python免费学习笔记(深入)”;
import pymysql
# 数据库连接参数,这里建议不要硬编码在代码里,后面会提到更安全的做法
DB_CONFIG = {
'host': 'localhost', # 数据库服务器地址
'user': 'your_username', # 数据库用户名
'password': 'your_password', # 数据库密码
'database': 'your_database', # 要连接的数据库名称
'charset': 'utf8mb4', # 字符集,很重要,避免乱码
'cursorclass': pymysql.cursors.DictCursor # 让查询结果以字典形式返回,方便操作
}
connection = None # 初始化连接变量
try:
# 建立数据库连接
connection = pymysql.connect(**DB_CONFIG)
print("数据库连接成功!")
# 创建一个游标对象,用于执行SQL查询
# DictCursor 会让查询结果以字典形式返回,方便通过列名访问数据
with connection.cursor() as cursor:
# 示例:创建一个表(如果不存在)
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
"""
cursor.execute(create_table_sql)
print("表 'users' 检查或创建完成。")
# 示例:插入一条数据
insert_sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
user_data = ('张三', 'zhangsan@example.com')
cursor.execute(insert_sql, user_data)
connection.commit() # 提交事务,保存更改
print(f"插入数据成功:{user_data}")
# 示例:查询所有数据
select_sql = "SELECT id, name, email FROM users"
cursor.execute(select_sql)
results = cursor.fetchall() # 获取所有查询结果
print("\n当前用户列表:")
if results:
for row in results:
print(f"ID: {row['id']}, 姓名: {row['name']}, 邮箱: {row['email']}")
else:
print("没有找到用户数据。")
# 示例:更新一条数据
update_sql = "UPDATE users SET name = %s WHERE email = %s"
update_data = ('李四', 'zhangsan@example.com')
cursor.execute(update_sql, update_data)
connection.commit()
print(f"更新数据成功:将 'zhangsan@example.com' 的姓名更新为 '李四'")
# 再次查询确认更新
cursor.execute(select_sql)
results_after_update = cursor.fetchall()
print("\n更新后的用户列表:")
for row in results_after_update:
print(f"ID: {row['id']}, 姓名: {row['name']}, 邮箱: {row['email']}")
except pymysql.Error as e:
print(f"数据库操作失败: {e}")
if connection:
connection.rollback() # 发生错误时回滚事务
print("事务已回滚。")
except Exception as e:
print(f"发生未知错误: {e}")
finally:
if connection:
connection.close() # 确保连接被关闭
print("数据库连接已关闭。")
这段代码展示了从连接到执行增删改查的基本流程。特别要注意的是
charset='utf8mb4'
with connection.cursor() as cursor:
在Python连接MySQL的生态里,
PyMySQL
MySQLdb
MySQLdb
MySQLdb
而
PyMySQL
pip install PyMySQL
所以,我的建议是,如果你正在开发一个全新的Python 3项目,或者打算将现有项目迁移到Python 3,那么毫不犹豫地选择
PyMySQL
MySQLdb
MySQLdb
PyMySQL
将数据库的用户名、密码等敏感信息直接写在代码里(就像我上面那个示例里那样),在开发阶段图个方便可能还行,但一旦项目上线,这简直就是个安全大漏洞。想象一下,如果你的代码库被泄露,数据库的门就直接敞开了。所以,妥善管理数据库凭证是生产环境中非常重要的一环。
有几种比较常见的做法,可以有效提升安全性:
使用环境变量: 这是我最推荐的一种方式。你可以在部署服务器上设置环境变量,比如
MYSQL_HOST
MYSQL_USER
MYSQL_PASSWORD
os.getenv()
import os
import pymysql
DB_CONFIG = {
'host': os.getenv('MYSQL_HOST', 'localhost'), # 默认值,防止环境变量未设置
'user': os.getenv('MYSQL_USER', 'root'),
'password': os.getenv('MYSQL_PASSWORD', ''),
'database': os.getenv('MYSQL_DATABASE', 'test_db'),
'charset': 'utf8mb4',
'cursorclass': pymysql.cursors.DictCursor
}
# ... 后续连接代码 ...在Linux/macOS中,你可以在终端这样设置:
export MYSQL_HOST='your_host'
export MYSQL_USER='your_user'
export MYSQL_PASSWORD='your_password'
配置文件: 可以使用
.ini
.json
.yaml
config.ini
[database] host = localhost user = your_username password = your_password database = your_database
然后在Python代码中读取:
import configparser
import os
import pymysql
config = configparser.ConfigParser()
# 尝试从当前目录或指定路径加载配置文件
config_path = os.path.join(os.path.dirname(__file__), 'config.ini')
if os.path.exists(config_path):
config.read(config_path)
else:
print("Warning: config.ini not found, falling back to environment variables or defaults.")
# 如果配置文件不存在,可以考虑从环境变量获取或使用默认值
DB_CONFIG = {
'host': config.get('database', 'host', fallback=os.getenv('MYSQL_HOST', 'localhost')),
'user': config.get('database', 'user', fallback=os.getenv('MYSQL_USER', 'root')),
'password': config.get('database', 'password', fallback=os.getenv('MYSQL_PASSWORD', '')),
'database': config.get('database', 'database', fallback=os.getenv('MYSQL_DATABASE', 'test_db')),
'charset': 'utf8mb4',
'cursorclass': pymysql.cursors.DictCursor
}
# ... 后续连接代码 ...关键点在于: 这个
config.ini
.gitignore
云服务商的秘密管理服务: 如果你的应用部署在云平台上(如AWS Secrets Manager, Azure Key Vault, Google Secret Manager),这些服务提供了更高级的凭证管理方案,可以动态获取、轮换凭证,安全性更高。这通常适用于大型、复杂的云原生应用。
无论你选择哪种方式,核心原则都是将敏感信息与代码分离,并且确保敏感信息本身在传输和存储过程中是安全的。
在使用PyMySQL连接MySQL数据库时,遇到各种错误是家常便饭。很多时候,错误信息本身就能提供不少线索,但有时也需要一些排查技巧。
连接失败 (OperationalError: (2003, "Can't connect to MySQL server on ...")
(1045, "Access denied for user ...")
ping your_mysql_host
sudo systemctl status mysql
sudo service mysql status
host
port
3306
user
password
GRANT ALL PRIVILEGES ON your_database.* TO 'your_username'@'your_client_ip' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES;
'%'
database
SQL语句执行错误 (ProgrammingError
DataError
ProgrammingError: (1064, "You have an error in your SQL syntax...")
mysql
MySQL Workbench
ProgrammingError: (1146, "Table 'your_database.your_table' doesn't exist")
(1054, "Unknown column '...' in 'field list'")
DataError
IntegrityError
VARCHAR(10)
INT
IntegrityError
UNIQUE
NOT NULL
charset
utf8mb4
utf8mb4
调试技巧:
cursor.execute()
pdb
遇到问题不要慌,先看错误信息,它往往就是最好的老师。结合这些排查思路,大多数连接和SQL执行问题都能迎刃而解。
数据库操作,尤其是涉及多个步骤的数据修改,事务管理就显得尤为重要。同时,面对无处不在的网络攻击,SQL注入防范更是重中之重。PyMySQL在这两方面都提供了成熟的解决方案。
事务(Transaction)是一组原子性的数据库操作。要么这些操作全部成功提交,要么全部失败回滚,不会出现部分成功的情况。这对于保持数据的一致性和完整性至关重要,比如银行转账,从一个账户扣钱,给另一个账户加钱,这两个操作必须同时成功或同时失败。
PyMySQL默认是开启自动提交(autocommit)的,这意味着你每执行一条SQL语句,数据库都会立即提交更改。但在需要事务管理的场景下,我们需要手动关闭自动提交,然后显式地进行提交或回滚。
import pymysql
DB_CONFIG = {
'host': 'localhost',
'user': 'your_username',
'password': 'your_password',
'database': 'your_database',
'charset': 'utf8mb4',
'cursorclass': pymysql.cursors.DictCursor
}
connection = None
try:
connection = pymysql.connect(**DB_CONFIG)
# 关闭自动提交,手动管理事务
connection.autocommit(False)
print("数据库连接成功,自动提交已关闭。")
with connection.cursor() as cursor:
# 假设我们有一个 accounts 表,有 id 和 balance 字段
# 示例:创建 accounts 表
create_table_sql = """
CREATE TABLE IF NOT EXISTS accounts (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
"""
cursor.execute(create_table_sql)
# 确保有测试数据
cursor.execute("INSERT IGNORE INTO accounts (id, name, balance) VALUES (1, 'Alice', 1000.00)")
cursor.execute("INSERT IGNORE INTO accounts (id, name, balance) VALUES (2, 'Bob', 500.00)")
connection.commit() # 提交初始数据
print("\n开始转账事务:从 Alice 转 200 到 Bob")
# 1. Alice 账户扣除 200
update_alice_sql = "UPDATE accounts SET balance = balance - %s WHERE id = %s"
cursor.execute(update_alice_sql, (200.00, 1))
print("Alice 账户扣除 200。")
# 模拟一个可能失败的操作,比如 Bob 的账户不存在,或者余额不足等
# if True: # 假设这里有个条件判断,如果失败就抛异常
# raise ValueError("模拟转账失败!")
# 2. Bob 账户增加 200
update_bob_sql = "UPDATE accounts SET balance = balance + %s WHERE id = %s"
cursor.execute(update_bob_sql, (200.00, 2))
print("Bob 账户增加 200。")
# 如果所有操作都成功,则提交事务
connection.commit()
print("转账事务成功提交!")
except pymysql.Error as e:
print(f"数据库操作失败: {e}")
if connection:
connection.rollback() # 任何一步出错,都回滚所有操作
print("事务已回滚,数据恢复到转账前状态。")
except Exception as e:
print(f"发生未知错误: {e}")
if connection:
connection.rollback()
print("事务已回滚。")
finally:
if connection:
connection.close()
print("数据库连接已关闭。")
# 再次查询确认结果
try:
connection = pymysql.connect(**DB_CONFIG)
with connection.cursor() as cursor:
cursor.execute("SELECT id, name, balance FROM accounts WHERE id IN (1, 2)")
results = cursor.fetchall()
print("\n转账后的账户余额:")
for row in results:
print(f"ID: {row['id']}, 姓名: {row['name']}, 余额: {row['balance']}")
except pymysql.Error as e:
print(f"查询余额失败: {e}")
finally:
if connection:
connection.close()在这个例子中,
connection.autocommit(False)
connection.commit()
connection.rollback()
SQL注入是一种常见的Web安全漏洞,攻击者通过在输入字段中插入恶意的SQL代码,来操纵数据库查询,可能导致数据泄露、篡改甚至删除。
PyMySQL,以及所有遵循DB-API 2.0规范的Python数据库连接库,都提供了强大的机制来防范SQL注入,那就是参数化查询(Parameterized Queries)。
错误的做法(容易被SQL注入):
# 千万不要这样做!
user_input = "'; DROP TABLE users; --" # 攻击者输入
sql = f"SELECT * FROM users WHERE name = '{user_input}'"
# 最终SQL会变成:SELECT * FROM users WHERE name = ''; DROP TABLE users; --'
# 这会导致你的 users 表被删除!
cursor.execute(sql)正确的做法(使用参数化查询):
以上就是python如何连接mysql数据库_python使用PyMySQL连接MySQL数据库教程的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号