SQLAlchemy快速入门:从模型定义到数据迁移

一、ORM框架简介

ORM(对象关系映射)是一种通过面向对象的方式操作数据库的技术。它将数据库表结构映射为Python类,表中的行对应类的实例,字段对应类的属性。

核心优势:

  1. 避免直接编写SQL语句
  2. 支持多种数据库系统(MySQL/PostgreSQL/SQLite等)
  3. 自动处理数据类型转换
  4. 内置基础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='学生信息表';

四、注意事项

  1. 字段命名规范
    • 避免使用SQL关键字(如class→class_id)
    • 建议使用蛇形命名法(create_time)

  2. 默认值设置

    # 正确写法(不调用函数)
    create_time = Column(DateTime, default=datetime.now)
    
    # 错误写法(会使用迁移时的时间)
    create_time = Column(DateTime, default=datetime.now())
    
  3. 数据迁移策略
    • 开发环境:使用create_all()快速建表
    • 生产环境:推荐使用Alembic进行版本管理
    • 已有表结构:不会覆盖或修改现有表

  4. 多数据库支持

    # 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应用的数据库层,后续可进一步学习:

  1. 关系型字段定义(外键、关联查询)
  2. 数据库事务管理
  3. 查询结果分页处理
  4. 数据校验与类型转换
posted @ 2025-03-26 15:18  千陌666  阅读(75)  评论(0)    收藏  举报