[SQLAlchemy学习笔记]什么场景用orm模型类,什么时候用Table类
在 SQLAlchemy 中,ORM 模型类和 Table 类都可以用来定义数据库表结构,但它们适用于不同的场景和开发风格。以下是它们的适用场景、对比以及生活中的例子类比:
适用场景
ORM 模型类
- 面向对象开发:当项目需要以面向对象的方式进行开发,且业务逻辑复杂时,ORM 模型类可以提供更直观的抽象。
- 代码可读性和维护性:ORM 模型类使得代码更加直观和易于维护,特别是当团队成员熟悉面向对象编程时。
- 查询和操作数据:当需要频繁地查询和操作数据,而不是直接操作表结构时,ORM 模型类更加方便。
Table 类
- 直接操作数据库表结构:当需要直接操作数据库表结构,比如创建、修改、删除表,或者进行数据库迁移时,Table 类更加灵活。
- 动态表结构:当表结构是动态生成的,或者需要根据运行时的条件来定义表时,Table 类更适合。
- 性能优化:在一些性能要求较高的场景中,直接使用 Table 类可以减少 ORM 层的开销。
对比
特点 | ORM 模型类 | Table 类 |
---|---|---|
抽象层次 | 提供面向对象的抽象,操作数据 | 更接近数据库,操作表结构 |
灵活性 | 中,适合固定业务逻辑 | 高,适合动态变化 |
性能 | 稍低,但提供更方便的操作 | 较高,减少 ORM 层开销 |
学习曲线 | 较高,需要理解 ORM 概念 | 较低,直接操作数据库 |
适用场景 | 面向对象开发、复杂业务逻辑、查询和操作数据 | 数据库表结构操作、动态表、性能优化 |
生活中的例子类比
ORM 模型类
假设你要管理一个学校的学籍系统,其中有一个表用于存储学生的基本信息。使用 ORM 模型类就像定义一个学生类,每个学生对象都有姓名、年龄、性别等属性。你可以通过创建、更新、删除学生对象来管理学生信息,这种方式直观且易于理解。
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Student(Base):
__tablename__ = 'students'
id = Column(Integer, primary_key=True)
name = Column(String(50))
age = Column(Integer)
sex = Column(String(10))
# 创建学生对象
student = Student(name='张三', age=18, sex='男')
# 更新学生信息
student.age = 19
# 删除学生对象
del student
Table 类
假设你要设计一个学校的数据库系统,需要先定义数据库的表结构。使用 Table 类就像设计一张表格,表格中有学号、姓名、年龄、性别等列。你可以通过定义表格的列和约束来创建表结构,这种方式更接近数据库的设计。
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('mysql+pymysql://root:root@localhost/myorm1', echo=True)
metadata = MetaData()
students_table = Table(
'students', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('age', Integer),
Column('sex', String(10))
)
# 创建表
metadata.create_all(engine)
总结
- ORM 模型类:适合需要面向对象开发、复杂业务逻辑和频繁数据操作的场景。
- Table 类:适合需要直接操作数据库表结构、动态表结构和性能优化的场景。
通过理解两者的特性和适用场景,你可以根据项目的具体需求选择最合适的方式。