返回介绍

表演时刻

发布于 2025-01-02 21:53:49 字数 3311 浏览 0 评论 0 收藏 0

经历了一个漫长的过程来定义数据库,我却还没向你展示它们如何使用。 由于应用还没有任何数据库逻辑,所以让我们在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文