好的!以下是一个详细的 MySQL 入门学习文档,针对 Python 开发者,包含使用 SQLite 进行学习的示例。文档将涵盖实际开发中需要使用的各种相关操作和知识,帮助您从基础开始,逐步掌握在 Python 中使用 MySQL 的技能。
MySQL 入门学习文档
目录
- 简介
- 环境搭建
- 2.1 安装 MySQL
- 2.2 安装 Python 和 虚拟环境
- 2.3 安装数据库连接库
- SQL 基础
- 3.1 数据库和表
- 3.2 数据类型
- 3.3 基本 SQL 语句
- Python 操作 MySQL
- 4.1 连接到数据库
- 4.2 执行 SQL 语句
- 4.3 事务处理
- 4.4 处理异常
- 使用 ORM:SQLAlchemy
- 5.1 安装 SQLAlchemy
- 5.2 定义模型
- 5.3 创建和查询数据
- 5.4 更新和删除数据
- 使用 SQLite 进行练习
- 6.1 SQLite 简介
- 6.2 在 Python 中使用 SQLite
- 实际开发中的注意事项
- 7.1 数据库设计
- 7.2 性能优化
- 7.3 安全性考虑
- 部署 MySQL 服务
- 8.1 在本地部署 MySQL
- 8.2 在服务器上部署 MySQL
- 附加资源
- 总结
1. 简介
MySQL 是一种流行的开源关系型数据库管理系统(RDBMS),广泛应用于 Web 开发和各种应用程序。它以高性能、可靠性和易用性著称。
对于 Python 开发者,了解如何与 MySQL 进行交互是非常重要的技能。本学习文档将指导您:
- 理解 MySQL 的基本概念和 SQL 语句
- 在 Python 中连接并操作 MySQL 数据库
- 使用 ORM(对象关系映射)工具,如 SQLAlchemy,提高开发效率
- 学习实际开发中需要注意的各种操作和知识
2. 环境搭建
2.1 安装 MySQL
2.1.1 下载 MySQL
- 访问 MySQL 官方网站 下载适合您操作系统的 MySQL 安装包。
2.1.2 安装 MySQL
- 根据下载的安装包,按照安装向导进行安装。
- 在安装过程中,设置 root 用户的密码,并记住它,后续需要使用。
2.1.3 配置 MySQL
- 安装完成后,确保 MySQL 服务已启动。
- 可以使用命令行或图形化工具(如 MySQL Workbench)连接到 MySQL。
2.1.4 验证安装
-
打开命令行,输入以下命令测试连接:
mysql -u root -p
-
输入密码后,应能进入 MySQL 命令行界面。
2.2 安装 Python 和 虚拟环境
2.2.1 安装 Python
- 访问 Python 官网 下载并安装 Python 3.6 或更高版本。
2.2.2 创建虚拟环境
-
使用虚拟环境隔离项目依赖。
python -m venv venv
-
激活虚拟环境:
-
Windows:
venv\Scripts\activate
-
macOS/Linux:
source venv/bin/activate
-
2.3 安装数据库连接库
2.3.1 选择数据库驱动
- 常用的 MySQL 数据库驱动有:
- mysql-connector-python:由 Oracle 官方提供。
- PyMySQL:纯 Python 实现。
- mysqlclient:需要编译,性能较好。
- 本文将使用 PyMySQL,因为它易于安装且无需编译。
2.3.2 安装 PyMySQL
pip install PyMySQL
2.3.3 安装 SQLAlchemy(可选)
- 后续将介绍如何使用 ORM 工具 SQLAlchemy。
pip install sqlalchemy
3. SQL 基础
在开始编写代码之前,了解一些 SQL 基础知识是非常有必要的。
3.1 数据库和表
- 数据库:数据的集合,每个数据库包含多个表。
- 表:由行和列组成的结构,用于存储数据。
3.2 数据类型
- 数值类型:INT、FLOAT、DOUBLE、DECIMAL
- 字符串类型:CHAR、VARCHAR、TEXT
- 日期和时间类型:DATE、TIME、DATETIME、TIMESTAMP
3.3 基本 SQL 语句
3.3.1 创建数据库
CREATE DATABASE mydatabase;
3.3.2 使用数据库
USE mydatabase;
3.3.3 创建表
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),email VARCHAR(100),age INT
);
3.3.4 插入数据
INSERT INTO users (name, email, age) VALUES ('Alice', 'alice@example.com', 30);
3.3.5 查询数据
SELECT * FROM users;
3.3.6 更新数据
UPDATE users SET age = 31 WHERE name = 'Alice';
3.3.7 删除数据
DELETE FROM users WHERE name = 'Alice';
4. Python 操作 MySQL
4.1 连接到数据库
4.1.1 导入 PyMySQL
import pymysql
4.1.2 建立连接
connection = pymysql.connect(host='localhost',user='root',password='your_password',database='mydatabase',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor
)
说明:
- host:数据库服务器地址,默认本地为
localhost
。 - user:数据库用户名,默认管理员为
root
。 - password:对应用户的密码。
- database:要连接的数据库名称。
- charset:字符集设置为
utf8mb4
,支持 Emoji 等字符。 - cursorclass:指定返回结果为字典形式。
4.1.3 测试连接
try:with connection.cursor() as cursor:cursor.execute("SELECT VERSION()")result = cursor.fetchone()print("Database version:", result)
finally:connection.close()
4.2 执行 SQL 语句
4.2.1 创建表
try:with connection.cursor() as cursor:sql = """CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),email VARCHAR(100),age INT)"""cursor.execute(sql)connection.commit()
finally:connection.close()
4.2.2 插入数据
try:with connection.cursor() as cursor:sql = "INSERT INTO users (name, email, age) VALUES (%s, %s, %s)"cursor.execute(sql, ('Bob', 'bob@example.com', 25))connection.commit()
finally:connection.close()
4.2.3 查询数据
try:with connection.cursor() as cursor:sql = "SELECT * FROM users WHERE age > %s"cursor.execute(sql, (20,))results = cursor.fetchall()for row in results:print(row)
finally:connection.close()
4.2.4 更新数据
try:with connection.cursor() as cursor:sql = "UPDATE users SET age = %s WHERE name = %s"cursor.execute(sql, (26, 'Bob'))connection.commit()
finally:connection.close()
4.2.5 删除数据
try:with connection.cursor() as cursor:sql = "DELETE FROM users WHERE name = %s"cursor.execute(sql, ('Bob',))connection.commit()
finally:connection.close()
4.3 事务处理
- 默认情况下,PyMySQL 会自动开启事务。
- 使用
connection.commit()
提交事务。 - 使用
connection.rollback()
回滚事务。
4.3.1 示例:事务操作
try:with connection.cursor() as cursor:sql1 = "INSERT INTO users (name, email, age) VALUES (%s, %s, %s)"sql2 = "UPDATE accounts SET balance = balance - %s WHERE user_id = %s"cursor.execute(sql1, ('Charlie', 'charlie@example.com', 28))cursor.execute(sql2, (100, 1))connection.commit()
except Exception as e:connection.rollback()print("Transaction failed:", e)
finally:connection.close()
4.4 处理异常
- 在数据库操作中,可能会发生各种异常,需要进行捕获和处理。
4.4.1 常见异常
pymysql.err.InternalError
:内部错误pymysql.err.OperationalError
:操作错误,如连接失败pymysql.err.IntegrityError
:完整性错误,如主键重复
4.4.2 异常处理示例
import pymysqltry:# 数据库操作pass
except pymysql.err.IntegrityError as e:print("Integrity error:", e)
except pymysql.err.OperationalError as e:print("Operational error:", e)
except Exception as e:print("Unexpected error:", e)
finally:connection.close()
5. 使用 ORM:SQLAlchemy
5.1 安装 SQLAlchemy
pip install sqlalchemy
5.2 定义模型
5.2.1 导入模块
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
5.2.2 创建数据库引擎
engine = create_engine('mysql+pymysql://root:your_password@localhost/mydatabase')
5.2.3 创建基类
Base = declarative_base()
5.2.4 定义模型类
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String(100))email = Column(String(100))age = Column(Integer)def __repr__(self):return f"<User(name='{self.name}', email='{self.email}', age={self.age})>"
5.2.5 创建表
Base.metadata.create_all(engine)
5.3 创建和查询数据
5.3.1 创建会话
Session = sessionmaker(bind=engine)
session = Session()
5.3.2 添加数据
new_user = User(name='David', email='david@example.com', age=35)
session.add(new_user)
session.commit()
5.3.3 查询数据
users = session.query(User).filter(User.age > 30).all()
for user in users:print(user)
5.4 更新和删除数据
5.4.1 更新数据
user = session.query(User).filter_by(name='David').first()
user.age = 36
session.commit()
5.4.2 删除数据
user = session.query(User).filter_by(name='David').first()
session.delete(user)
session.commit()
6. 使用 SQLite 进行练习
6.1 SQLite 简介
- SQLite 是一个轻量级的嵌入式关系型数据库,无需单独安装服务器。
- 适合用于学习和开发阶段的测试。
6.2 在 Python 中使用 SQLite
6.2.1 使用内置模块 sqlite3
import sqlite3connection = sqlite3.connect('test.db')
cursor = connection.cursor()
6.2.2 执行 SQL 语句
cursor.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)')
cursor.execute('INSERT INTO users (name) VALUES (?)', ('Eve',))
connection.commit()
6.2.3 查询数据
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:print(row)
6.2.4 关闭连接
connection.close()
6.2.5 使用 SQLAlchemy 操作 SQLite
-
修改数据库引擎的连接字符串:
engine = create_engine('sqlite:///test.db')
-
其余操作与 MySQL 基本一致。
7. 实际开发中的注意事项
7.1 数据库设计
- 规范化:避免数据冗余,确保数据一致性。
- 命名规范:表名、字段名应具有意义,遵循命名规则。
- 主键和外键:设计合适的主键,使用外键维护表之间的关系。
- 索引:为常用的查询字段添加索引,提高查询性能。
7.2 性能优化
- 使用索引:加速查询,但过多的索引会影响写入性能。
- 查询优化:避免使用
SELECT *
,仅选择需要的字段。 - 分页查询:对于大量数据,使用分页避免一次性加载过多数据。
- 连接池:在 Python 中使用数据库连接池,减少连接开销。
7.3 安全性考虑
- 防止 SQL 注入:使用参数化查询或 ORM,避免直接拼接 SQL。
- 加密敏感数据:对密码等敏感信息进行哈希或加密存储。
- 权限管理:限制数据库用户的权限,只授予必要的权限。
- 备份和恢复:定期备份数据库,制定恢复计划。
8. 部署 MySQL 服务
8.1 在本地部署 MySQL
-
安装 MySQL:参考环境搭建部分。
-
配置远程访问:如果需要其他机器访问本地 MySQL,需要配置允许远程连接。
-- 在 MySQL 命令行中执行 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION; FLUSH PRIVILEGES;
-
修改配置文件:编辑
my.cnf
或my.ini
,注释掉或修改bind-address
:# bind-address = 127.0.0.1
-
重启 MySQL 服务。
8.2 在服务器上部署 MySQL
- 选择服务器:可以使用云服务器(如 AWS、阿里云、腾讯云等)。
- 安装 MySQL:根据服务器的操作系统,安装对应版本的 MySQL。
- 安全配置:
- 设置强密码。
- 禁止 root 用户远程登录,创建专用的数据库用户。
- 开启防火墙,仅开放必要的端口(如 3306)。
- 使用 SSL 加密连接。
- 备份策略:配置自动备份,防止数据丢失。
9. 附加资源
- MySQL 官方文档:https://dev.mysql.com/doc/
- PyMySQL 文档:https://pymysql.readthedocs.io/
- SQLAlchemy 文档:https://docs.sqlalchemy.org/
- MySQL 教程:菜鸟教程 MySQL
- SQL 基础教程:W3Schools SQL Tutorial