在 ORM 中,模型一般是一个 Python 类,类中的属性对应数据库表中的列。
最常用的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 |
二进制文件 |
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
最常使用的SQLAlchemy列选项
选项名 说 明
primary_key 如果设为 True ,这列就是表的主键
unique 如果设为 True ,这列不允许出现重复的值
index 如果设为 True ,为这列创建索引,提升查询效率
nullable 如果设为 True ,这列允许使用空值;如果设为 False ,这列不允许使用空值
default 为这列定义默认值
常用的SQLAlchemy关系选项
选项名 说 明
backref 在关系的另一个模型中添加反向引用
primaryjoin 明确指定两个模型之间使用的联结条件。只在模棱两可的关系中需要指定
lazy 指定如何加载相关记录。可选值有 select (首次访问时按需加载)、 immediate (源对象加
载后就加载)、 joined (加载记录,但使用联结)、 subquery (立即加载,但使用子查询),
noload (永不加载)和 dynamic (不加载记录,但提供加载记录的查询)
hello.py:关系
class Role(db.Model):
# ...
users = db.relationship('User', backref='role')
class User(db.Model):
# ...
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
SQLAlchemy 为很多数据库引擎提供抽象层
数据库
会话也称为事务
数据库会话能保证数据库的一致性。提交操作使用原子方式把会话中的对象全部写入数据
库。
数据库会话也可 回滚 。调用 db.session.rollback() 后,添加到数据库会话
中的所有对象都会还原到它们在数据库时的状态。
常用的SQLAlchemy查询过滤器
过滤器 |
说 明 |
filter() |
把过滤器添加到原查询上,返回一个新查询 |
filter_by() |
把等值过滤器添加到原查询上,返回一个新查询 |
limit() |
使用指定的值限制原查询返回的结果数量,返回一个新查询 |
offset() |
偏移原查询返回的结果,返回一个新查询 |
order_by() |
根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by() |
根据指定条件对原查询结果进行分组,返回一个新查询 |
最常使用的SQLAlchemy查询执行函数
方 法 |
说 明 |
all() |
以列表形式返回查询的所有结果 |
first() |
返回查询的第一个结果,如果没有结果,则返回 None |
first_or_404() |
返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误响应 |
get() |
返回指定主键对应的行,如果没有对应的行,则返回 None |
get_or_404() |
返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误响应 |
count() |
返回查询结果的数量 |
paginate() |
返回一个 Paginate 对象,它包含指定范围内的结果 |
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.name.data).first()
if user is None:
user = User(username = form.name.data)
db.session.add(user)
session['known'] = False
else:
session['known'] = True
session['name'] = form.name.data
form.name.data = ''
return redirect(url_for('index'))
return render_template('index.html',
form = form, name = session.get('name'),
known = session.get('known', False))