Python3 MySQL数据库连接
PyMySQL驱动知识点汇总 – 编程小白也能懂的详细指南
数据库连接流程概览
1
安装PyMySQL
2
导入模块
3
建立连接
4
创建游标
5
执行SQL
6
处理结果
7
关闭连接
安装PyMySQL
在使用PyMySQL之前,需要先安装它。最简单的方法是使用pip:
pip install pymysql
安装完成后,就可以在Python脚本中导入并使用PyMySQL模块了。
提示: 如果你同时安装了Python2和Python3,可能需要使用
pip3 install pymysql
来确保安装到Python3环境中。
建立数据库连接
连接MySQL数据库需要提供以下信息:
- 主机地址 (host) – 数据库服务器的地址
- 端口 (port) – MySQL服务端口,默认是3306
- 用户名 (user) – 数据库登录用户名
- 密码 (password) – 数据库登录密码
- 数据库名 (database) – 要连接的数据库名称
建立连接的基本代码:
import pymysql
# 创建连接对象
connection = pymysql.connect(
host=‘localhost’, # 数据库服务器地址
user=‘your_username’, # 用户名
password=‘your_password’, # 密码
database=‘your_database’, # 数据库名称
port=3306, # 端口,MySQL默认3306
charset=‘utf8mb4’ # 字符编码
)
# 创建连接对象
connection = pymysql.connect(
host=‘localhost’, # 数据库服务器地址
user=‘your_username’, # 用户名
password=‘your_password’, # 密码
database=‘your_database’, # 数据库名称
port=3306, # 端口,MySQL默认3306
charset=‘utf8mb4’ # 字符编码
)
注意: 实际开发中不要把密码直接写在代码里!应该使用环境变量或配置文件来存储敏感信息。
使用游标执行SQL
连接数据库后,需要通过”游标”来执行SQL语句。游标就像是一个指针,用于在数据库结果集中导航。
创建游标:
# 创建游标对象
cursor = connection.cursor()
cursor = connection.cursor()
执行SQL语句:
# 执行SQL语句
cursor.execute(“SELECT * FROM users”)
cursor.execute(“SELECT * FROM users”)
对于需要插入数据的SQL语句,通常使用参数化查询来防止SQL注入攻击:
# 安全的方式:使用参数化查询
sql = “INSERT INTO users (name, age) VALUES (%s, %s)”
data = (‘张三’, 25)
cursor.execute(sql, data)
sql = “INSERT INTO users (name, age) VALUES (%s, %s)”
data = (‘张三’, 25)
cursor.execute(sql, data)
提示: 使用参数化查询(%s占位符)而不是拼接字符串,这是防止SQL注入的关键安全措施!
处理查询结果
执行SELECT查询后,可以使用游标的方法获取结果:
# 获取单条记录
one_row = cursor.fetchone()
# 获取多条记录(指定数量)
many_rows = cursor.fetchmany(5) # 获取5条记录
# 获取所有记录
all_rows = cursor.fetchall()
one_row = cursor.fetchone()
# 获取多条记录(指定数量)
many_rows = cursor.fetchmany(5) # 获取5条记录
# 获取所有记录
all_rows = cursor.fetchall()
获取的结果通常是元组(tuple)的列表,每条记录是一个元组:
# 示例:[(1, ‘张三’, 25), (2, ‘李四’, 30)]
你也可以获取字典形式的结果(更易读):
# 创建游标时指定返回字典格式
cursor = connection.cursor(pymysql.cursors.DictCursor)
cursor.execute(“SELECT * FROM users”)
result = cursor.fetchall()
# 示例:[{‘id’: 1, ‘name’: ‘张三’, ‘age’: 25}, …]
cursor = connection.cursor(pymysql.cursors.DictCursor)
cursor.execute(“SELECT * FROM users”)
result = cursor.fetchall()
# 示例:[{‘id’: 1, ‘name’: ‘张三’, ‘age’: 25}, …]
事务管理
在MySQL中,事务是一组SQL操作,这些操作要么全部成功,要么全部失败。
PyMySQL默认开启了事务,执行修改操作后需要手动提交:
try:
# 执行一些修改操作
cursor.execute(“INSERT …”)
cursor.execute(“UPDATE …”)
# 提交事务
connection.commit()
except:
# 发生错误时回滚
connection.rollback()
# 执行一些修改操作
cursor.execute(“INSERT …”)
cursor.execute(“UPDATE …”)
# 提交事务
connection.commit()
except:
# 发生错误时回滚
connection.rollback()
重要: 对于INSERT、UPDATE、DELETE等操作,执行后必须调用
connection.commit()
,否则更改不会保存到数据库!
提示: 使用
with
语句可以自动管理事务和关闭:
with connection.cursor() as cursor:
cursor.execute(“…”)
connection.commit()
cursor.execute(“…”)
connection.commit()
关闭连接
使用完数据库后,应该关闭游标和连接以释放资源:
# 关闭游标
cursor.close()
# 关闭连接
connection.close()
cursor.close()
# 关闭连接
connection.close()
更安全的做法是使用try...finally
确保连接关闭:
try:
# 数据库操作代码…
finally:
cursor.close()
connection.close()
# 数据库操作代码…
finally:
cursor.close()
connection.close()
或者使用上下文管理器自动关闭:
with pymysql.connect(…) as connection:
with connection.cursor() as cursor:
cursor.execute(“SELECT …”)
result = cursor.fetchall()
# 这里会自动提交事务
# 这里连接会自动关闭
with connection.cursor() as cursor:
cursor.execute(“SELECT …”)
result = cursor.fetchall()
# 这里会自动提交事务
# 这里连接会自动关闭
完整代码示例
下面是一个完整的PyMySQL使用示例,包含连接、查询、插入和关闭操作:
import pymysql
# 建立数据库连接
connection = pymysql.connect(
host=‘localhost’,
user=‘test_user’,
password=‘secure_password’,
database=‘test_db’,
charset=‘utf8mb4’,
cursorclass=pymysql.cursors.DictCursor # 返回字典格式结果
)
try:
with connection.cursor() as cursor:
# 查询数据
sql = “SELECT id, name, email FROM users WHERE age > %s”
cursor.execute(sql, (20,))
result = cursor.fetchall()
print(“查询结果:”)
for row in result:
print(row)
# 插入新数据
sql = “INSERT INTO users (name, email, age) VALUES (%s, %s, %s)”
cursor.execute(sql, (‘王五’, ‘wangwu@example.com’, 28))
# 提交事务
connection.commit()
finally:
# 关闭连接
connection.close()
print(“数据库连接已关闭”)
# 建立数据库连接
connection = pymysql.connect(
host=‘localhost’,
user=‘test_user’,
password=‘secure_password’,
database=‘test_db’,
charset=‘utf8mb4’,
cursorclass=pymysql.cursors.DictCursor # 返回字典格式结果
)
try:
with connection.cursor() as cursor:
# 查询数据
sql = “SELECT id, name, email FROM users WHERE age > %s”
cursor.execute(sql, (20,))
result = cursor.fetchall()
print(“查询结果:”)
for row in result:
print(row)
# 插入新数据
sql = “INSERT INTO users (name, email, age) VALUES (%s, %s, %s)”
cursor.execute(sql, (‘王五’, ‘wangwu@example.com’, 28))
# 提交事务
connection.commit()
finally:
# 关闭连接
connection.close()
print(“数据库连接已关闭”)