SQLAlchemy快速入门:从模型定义到数据迁移
一、ORM框架简介
ORM(对象关系映射)是一种通过面向对象的方式操作数据库的技术。它将数据库表结构映射为Python类,表中的行对应类的实例,字段对应类的属性。
核心优势:
- 避免直接编写SQL语句
- 支持多种数据库系统(MySQL/PostgreSQL/SQLite等)
- 自动处理数据类型转换
- 内置基础CRUD操作
开发流程:
graph LR
A[定义模型类] --> B[配置数据库连接]
B --> C[执行数据迁移]
C --> D[操作模型对象]
二、初始化配置
1. 安装依赖
pip install sqlalchemy pymysql
2. 配置数据库连接(db.py)
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
# 创建数据库引擎
engine = create_engine(
url="mysql+pymysql://root:123@localhost:3306/students",
echo=True, # 输出SQL日志
pool_size=10, # 连接池大小
max_overflow=30, # 最大溢出连接数
pool_recycle=3600 # 连接回收时间(秒)
)
# 创建会话工厂
Session = sessionmaker(bind=engine)
session = Session()
# 声明模型基类
Base = declarative_base()
关键参数说明:
• url格式:数据库类型+驱动://用户名:密码@主机:端口/数据库名
• echo=True 调试时建议开启,生产环境应关闭
• pool_recycle 防止数据库断开连接(建议小于数据库的wait_timeout)
三、模型定义与数据迁移
1. 定义学生模型
from datetime import datetime
from db import Base
class Student(Base):
"""学生信息模型"""
__tablename__ = 'tb_student' # 指定对应表名
id = Column(Integer, primary_key=True, comment='主键ID')
name = Column(String(20), nullable=False, comment='学生姓名')
gender = Column(Boolean, default=True, comment='性别')
age = Column(SmallInteger, comment='年龄')
class_id = Column('class', SmallInteger, comment='班级')
description = Column(Text, comment='个人描述')
status = Column(Boolean, default=True, comment='在校状态')
create_time = Column(DateTime, default=datetime.now, comment='创建时间')
字段类型说明:
• Boolean → TINYINT(1)
• SmallInteger → SMALLINT
• DateTime → DATETIME
• Text → TEXT
2. 执行数据迁移
if __name__ == '__main__':
# 创建所有继承自Base的表
Base.metadata.create_all(engine)
print("数据表创建成功!")
执行后生成表结构:
CREATE TABLE tb_student (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
gender TINYINT(1) DEFAULT 1,
age SMALLINT,
class SMALLINT,
description TEXT,
status TINYINT(1) DEFAULT 1,
create_time DATETIME,
PRIMARY KEY (id)
) COMMENT='学生信息表';
四、注意事项
-
字段命名规范:
• 避免使用SQL关键字(如class→class_id)
• 建议使用蛇形命名法(create_time) -
默认值设置:
# 正确写法(不调用函数) create_time = Column(DateTime, default=datetime.now) # 错误写法(会使用迁移时的时间) create_time = Column(DateTime, default=datetime.now()) -
数据迁移策略:
• 开发环境:使用create_all()快速建表
• 生产环境:推荐使用Alembic进行版本管理
• 已有表结构:不会覆盖或修改现有表 -
多数据库支持:
# SQLite配置示例 engine = create_engine('sqlite:///students.db') # PostgreSQL配置示例 engine = create_engine('postgresql+psycopg2://user:pass@localhost/mydb')
五、常见问题
Q1:如何查看生成的SQL语句?
# 显示建表语句
from sqlalchemy.schema import CreateTable
print(CreateTable(Student.__table__).compile(engine))
Q2:模型需要修改怎么办?
• 开发阶段:直接删除表后重新执行create_all()
• 生产环境:使用Alembic迁移工具生成迁移脚本
Q3:如何添加表注释?
class Student(Base):
__tablename__ = 'tb_student'
__table_args__ = {'comment': '学生信息表'}
通过SQLAlchemy的ORM框架,开发者可以更高效地进行数据库操作,但需要注意:
• 复杂查询仍需编写原生SQL
• 批量操作时注意性能优化
• 生产环境建议使用连接池管理
掌握这些基础后,即可快速构建Python应用的数据库层,后续可进一步学习:
- 关系型字段定义(外键、关联查询)
- 数据库事务管理
- 查询结果分页处理
- 数据校验与类型转换

浙公网安备 33010602011771号