5.6 定义模型
Posted hl001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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应用开发实战(第二版)》
以上是关于5.6 定义模型的主要内容,如果未能解决你的问题,请参考以下文章