首页 > Python基础教程 >
-
带你认识 flask 中的数据库(3)
# get all posts written by a user >
1) > u = User.query.get(
> u
<User john>
> posts = u.posts.all()
> posts
[<Post my first post!>]
# same, but with a user that has no posts >
2) > u = User.query.get(
> u
<User susan>
> u.posts.all()
[]
# print post author and body for all posts >
> posts = Post.query.all()
posts: > for p in
... print(p.id, p.author.username, p.body)
...
1 john my first post!
# get all users in reverse alphabetical order
> User.query.order_by(User.username.desc()).all()
[<User susan>, <User john>]
Flask-SQLAlchemy文档是学习其对应操作的最好去处。
学完本节内容,我们需要清除这些测试用户和用户动态,以便保持数据整洁和为下一章做好准备
users = User.query.all()
for u in users:
db.session.delete(u)
...
posts = Post.query.all()
for p in posts:
db.session.delete(p)
...
db.session.commit()
Shell上下文
还记得上一节的启动Python解释器之后你做过什么吗?第一件事是运行两条导入语句:
from app import db
from app.models import User, Post
开发应用时,你经常会在Python shell中测试,所以每次重复上面的导入都会变得枯燥乏味。 flask shell
命令是flask
命令集中的另一个非常有用的工具。 shell
命令是Flask在继run
之后的实现第二个“核心”命令。这个命令的目的是在应用的上下文中启动一个Python解释器。这意味着什么?看下面的例子:
(venv) $ python
> app
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'app' is not defined
>
(venv) $ flask shell
> app
<Flask 'app'>
使用常规的解释器会话时,除非明确地被导入,否则app
对象是未知的,但是当使用flask shell
时,该命令预先导入应用实例。 flask shell
的绝妙之处不在于它预先导入了app
,而是你可以配置一个“shell上下文”,也就是可以预先导入一份对象列表。
在microblog.py中实现一个函数,它通过添加数据库实例和模型来创建了一个shell上下文环境:
from app import app, db
from app.models import User, Post
def make_shell_context():
return {'db': db, 'User': User, 'Post': Post}
app.shell_context_processor
装饰器将该函数注册为一个shell上下文函数。当flask shell
命令运行时,它会调用这个函数并在shell会话中注册它返回的项目。函数返回一个字典而不是一个列表,原因是对于每个项目,你必须通过字典的键提供一个名称以便在shell中被调用。
在添加shell上下文处理器函数后,你无需导入就可以使用数据库实例:
(venv) $ flask shell
> db
<SQLAlchemy engine=sqlite:////Users/migu7781/Documents/dev/flask/microblog2/app.db>
> User
<class 'app.models.User'>
> Post
<class 'app.models.Post'>
如果运行以上的db
, User
, Post
命令,报 NameError
异常,说明 make_shell_context()
没有被Flask注册。最有可能的原因是你的环境变量中没有设定 FLASK_APP=microblog.py
。此时你可以回到第一章复习一下如何设置FLASK_APP
环境变量。如果你经常忘记在新开终端时设置该环境变量,可以如第一章末尾处那样,在项目的根目录添加一个名为 .flaskenv
的文件,并将环境变量设置在里面。