表演时刻
经历了一个漫长的过程来定义数据库,我却还没向你展示它们如何使用。 由于应用还没有任何数据库逻辑,所以让我们在 Python 解释器中来使用以便熟悉它。 立即运行 python
命令来启动 Python(在启动解释器之前,确保您的虚拟环境已被激活)。
进入 Python 交互式环境后,导入数据库实例和模型:
>>> from app import db
>>> from app.models import User, Post
开始阶段,创建一个新用户:
>>> u = User(username='john', email='john@example.com')
>>> db.session.add(u)
>>> db.session.commit()
对数据库的更改是在会话的上下文中完成的,你可以通过 db.session
进行访问验证。 允许在会话中累积多个更改,一旦所有更改都被注册,你可以发出一个指令 db.session.commit()
来以原子方式写入所有更改。 如果在会话执行的任何时候出现错误,调用 db.session.rollback()
会中止会话并删除存储在其中的所有更改。 要记住的重要一点是,只有在调用 db.session.commit()
时才会将更改写入数据库。 会话可以保证数据库永远不会处于不一致的状态。
添加另一个用户:
>>> u = User(username='susan', email='susan@example.com')
>>> db.session.add(u)
>>> db.session.commit()
数据库执行返回所有用户的查询:
>>> users = User.query.all()
>>> users
[<User john>, <User susan>]
>>> for u in users:
... print(u.id, u.username)
...
1 john
2 susan
所有模型都有一个 query
属性,它是运行数据库查询的入口。 最基本的查询就是返回该类的所有元素,它被适当地命名为 all()
。 请注意,添加这些用户时,它们的 id
字段依次自动设置为 1 和 2。
另外一种查询方式是,如果你知道用户的 id
,可以用以下方式直接获取用户实例:
>>> u = User.query.get(1)
>>> u
<User john>
现在添加一条用户动态:
>>> u = User.query.get(1)
>>> p = Post(body='my first post!', author=u)
>>> db.session.add(p)
>>> db.session.commit()
我不需要为 timestamp
字段设置一个值,因为这个字段有一个默认值,你可以在模型定义中看到。 那么 user_id
字段呢? 回想一下,我在 User
类中创建的 db.relationship
为用户添加了 posts
属性,并为用户动态添加了 author
属性。 我使用 author
虚拟字段来调用其作者,而不必通过用户 ID 来处理。 SQLAlchemy 在这方面非常出色,因为它提供了对关系和外键的高级抽象。
为了完成演示,让我们看看另外的数据库查询案例:
>>> # get all posts written by a user
>>> u = User.query.get(1)
>>> u
<User john>
>>> posts = u.posts.all()
>>> posts
[<Post my first post!>]
>>> # same, but with a user that has no posts
>>> u = User.query.get(2)
>>> u
<User susan>
>>> u.posts.all()
[]
>>> # print post author and body for all posts
>>> posts = Post.query.all()
>>> for p in posts:
... 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()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论