在python开发中,和mysql数据库进行交互是非常常见的需求,无论是开发web应用、数据分析工具还是自动化脚本,都可能需要通过python操作mysql存储和读取数据。实现这个需求的核心是使用对应的数据库驱动,当前最常用的是pymysql库,它完全兼容python3,使用起来简单稳定。

环境准备与驱动安装
首先要确保本地已经安装了mysql数据库服务,并且知道数据库的连接信息,包括主机地址、端口、用户名、密码和要操作的数据库名称。如果还没有安装pymysql驱动,可以通过pip命令快速安装:
# 安装pymysql驱动 pip install pymysql
基础连接代码示例
使用pymysql连接mysql数据库的核心步骤是创建连接对象、创建游标对象、执行SQL语句、处理结果、关闭资源。下面是一个最基础的连接示例,包含完整的连接和简单查询逻辑:
import pymysql
# 定义数据库连接参数
db_config = {
'host': '127.0.0.1', # 数据库主机地址,本地为127.0.0.1
'port': 3306, # mysql默认端口
'user': 'root', # 数据库用户名
'password': '123456', # 数据库密码
'database': 'test_db',# 要操作的数据库名称
'charset': 'utf8mb4' # 字符集,避免中文乱码
}
try:
# 建立数据库连接
conn = pymysql.connect(**db_config)
# 创建游标对象,用于执行SQL语句
cursor = conn.cursor()
# 执行查询SQL
sql = "SELECT VERSION()"
cursor.execute(sql)
# 获取查询结果
result = cursor.fetchone()
print(f"mysql版本: {result[0]}")
except pymysql.MySQLError as e:
print(f"数据库连接或操作失败: {e}")
finally:
# 关闭游标和连接,释放资源
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
常见数据库操作示例
新增数据操作
新增数据使用INSERT语句,执行后需要通过commit方法提交事务,否则数据不会真正写入数据库:
import pymysql
db_config = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': '123456',
'database': 'test_db',
'charset': 'utf8mb4'
}
try:
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
# 新增数据的SQL语句
insert_sql = "INSERT INTO user (name, age) VALUES ('张三', 25)"
cursor.execute(insert_sql)
# 提交事务
conn.commit()
print(f"新增成功,影响行数: {cursor.rowcount}")
except pymysql.MySQLError as e:
# 出错时回滚事务
conn.rollback()
print(f"新增失败: {e}")
finally:
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
查询数据操作
查询数据支持多种方式获取结果,fetchone获取单条结果,fetchall获取所有结果,fetchmany获取指定条数结果:
import pymysql
db_config = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': '123456',
'database': 'test_db',
'charset': 'utf8mb4'
}
try:
conn = pymysql.connect(**db_config)
cursor = conn.cursor(pymysql.cursors.DictCursor) # 设置为字典游标,结果以字典形式返回
# 查询所有用户数据
query_sql = "SELECT * FROM user WHERE age > 20"
cursor.execute(query_sql)
# 获取所有结果
results = cursor.fetchall()
for row in results:
print(f"用户ID: {row['id']}, 姓名: {row['name']}, 年龄: {row['age']}")
except pymysql.MySQLError as e:
print(f"查询失败: {e}")
finally:
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
修改和删除数据操作
修改和删除操作同样需要提交事务,执行后可以通过rowcount属性获取影响的行数:
import pymysql
db_config = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': '123456',
'database': 'test_db',
'charset': 'utf8mb4'
}
try:
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
# 修改数据
update_sql = "UPDATE user SET age = 26 WHERE name = '张三'"
cursor.execute(update_sql)
# 删除数据
delete_sql = "DELETE FROM user WHERE age < 18"
cursor.execute(delete_sql)
# 提交事务
conn.commit()
print(f"修改影响行数: {cursor.rowcount}")
except pymysql.MySQLError as e:
conn.rollback()
print(f"操作失败: {e}")
finally:
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
连接注意事项
- 连接参数中的字符集建议设置为utf8mb4,支持所有unicode字符,避免出现emoji或者特殊中文无法存储的问题
- 所有数据库操作都建议放在try except块中,捕获pymysql的异常,避免程序直接崩溃
- 操作完成后一定要关闭游标和连接,或者使用上下文管理器自动管理资源,减少资源占用
- 生产环境中不要将数据库密码明文写在代码里,建议使用配置文件或者环境变量存储敏感信息
如果使用上下文管理器,连接代码可以简化,不需要手动关闭资源:
import pymysql
db_config = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': '123456',
'database': 'test_db',
'charset': 'utf8mb4'
}
# 使用with语句自动管理连接和游标资源
with pymysql.connect(**db_config) as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM user")
results = cursor.fetchall()
print(results)