模型这个术语表示程序使用的持久化实体。在ORM 中,模型一般是一个Python 类,类中的属性对应数据库表中的列。
Flask-SQLAlchemy 创建的数据库实例为模型提供了一个基类以及一系列辅助类和辅助函数,可用于定义模型的结构。下面的实例中分别定义rules和users的模型:
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) name = db.Column(db.String(64),unique=True) def __repr__(self): return '<User %r>' % self.name
类变量__tablename__ 定义在数据库中使用的表名。如果没有定义__tablename__,Flask-SQLAlchemy 会使用一个默认名字,但默认的表名没有遵守使用复数形式进行命名的约定,所以最好由我们自己来指定表名。其余的类变量都是该模型的属性,被定义为db.Column类的实例。
db.Column 类构造函数的第一个参数是数据库列和模型属性的类型。下表列出了一些可用的列类型以及在模型中使用的Python 类型。
类型名 | 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 | 任何Pyhton对象 | 自动使用Pickle 序列化 |
LargeBinary | str | 二进制文件 |
db.Column 中其余的参数指定属性的配置选项。下表 列出了一些可用选项。
选项名 | 说明 |
primary_key | 如果设为True,这列就是表的主键 |
unique | 如果设为True,这列不允许出现重复的值 |
index | 如果设为True,为这列创建索引,提升查询效率 |
nullable | 如果设为True,这列允许使用空值;如果设为False,这列不允许使用空值 |
default | 为这列定义默认值 |
Flask-SQLAlchemy 要求每个模型都要定义主键,这一列经常命名为id。
虽然没有强制要求,但这两个模型都定义了__repr()__ 方法,返回一个具有可读性的字符串表示模型,可在调试和测试时使用