5.6 定义模型

模型这个术语表示应用使用的持久化实体。在 ORM 中,模型一般是一个 Python 类,类中的属性对应于数据库表中的列。

Flask-SQLAlchemy 创建的数据库实例为模型提供了一个基类以及一系列辅助类和辅助函数,可用于定义模型的结构。图 5-1 中的 roles 表和 users 表可像示例 5-2 那样,定义为 Role 和 User 模型。

示例 5-2 hello.py:定义 Role 和 User 模型

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(64), unique=True)

    def __repr__(self):
        return '<Role %r>' % self.name

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)

    def __repr__(self):
        return '<User %r>' % self.username

类变量 __tablename__ 定义在数据库中使用的表名。如果没有定义 __tablename__,Flask-SQLAlchemy 会使用一个默认名称,但默认的表名没有遵守流行的使用复数命名的约定, 所以最好由我们自己来指定表名。其余的类变量都是该模型的属性,定义为 db.Column 类 的实例。

db.Column 类构造函数的第一个参数是数据库列和模型属性的类型。表 5-2 列出了一些可用的列类型以及在模型中使用的 Python 类型。

表5-2:最常用的SQLAlchemy列类型

类型名 Python类型 说明
Integer int 普通整数,通常是 32 位
SmallInteger int 取值范围小的整数,通常是 16 位
BigInteger int 或 long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 定点数
String str 变长字符串
Text str 变长字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长 Unicode 字符串
UnicodeText unicode 变长 Unicode 字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间
Interval datetime.timedelta 时间间隔
Enum str 一组字符串
PickleType 任何 Python 对象 自动使用 Pickle 序列化
LargeBinary str 二进制 blob

db.Column 的其余参数指定属性的配置选项。表 5-3 列出了一些可用选项。

表5-3:最常用的SQLAlchemy列选项

选项名 说明
primary_key 如果设为 True,列为表的主键
unique 如果设为 True,列不允许出现重复的值
index 如果设为 True,为列创建索引,提升查询效率
nullable 如果设为 True,列允许使用空值;如果设为 False,列不允许使用空值
default 为列定义默认值

Flask-SQLAlchemy 要求每个模型都定义主键,这一列经常命名为 id。

虽然没有强制要求,但这两个模型都定义了 __repr()__ 方法,返回一个具有可读性的字符串表示模型,供调试和测试时使用。

《基于Python的Web应用开发实战(第二版)》

posted @ 2019-01-07 17:37  °❆黄雷❄°  阅读(187)  评论(0编辑  收藏  举报