`
huangyiiiiii
  • 浏览: 118585 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

SQLAlchemy Examples

阅读更多
看 SQLAlchemy 自带的 zblog 的例子,可以看到 SQLAlchemy 一些非常有用的特性。

文章相关评论数统计

比如显示文章列表的同时我们希望获得相关文章的评论数,如果是用 django 那就只能放弃 ORM 的好处自己去执行 sql 语句了,否则就只会导致 n+1 条 SQL 语句的执行。
在 SQLAlchemy 中你可以把任意的 select 语句映射到一个 class ,这样就可以用一条 SQL 语句搞定,还能获得 ORM 的好处,下面是原封不动拷过来的代码(只调整了下格式):

   # Post mapper, these are posts within a blog.
# since we want the count of comments for each post,
# create a select that will get the posts
# and count the comments in one query.
posts_with_ccount = select(
[c for c in tables.posts.c if c.key != 'body'] + [
func.count(tables.comments.c.comment_id).label('comment_count')
],
from_obj = [
outerjoin(tables.posts, tables.comments)
],
group_by=[
c for c in tables.posts.c if c.key != 'body'
]
) .alias('postswcount')

# then create a Post mapper on that query.
# we have the body as "deferred" so that it loads only when needed,
# the user as a Lazy load, since the lazy load will run only once per user and
# its usually only one user's posts is needed per page,
# the owning blog is a lazy load since its also probably loaded into the identity map
# already, and topics is an eager load since that query has to be done per post in any
# case.
mapper(Post, posts_with_ccount, properties={
'id':posts_with_ccount.c.post_id,
'body':deferred(tables.posts.c.body),
'user':relation(user.User, lazy=True,
backref=backref('posts', cascade="all, delete-orphan")),
'blog':relation(Blog, lazy=True,
backref=backref('posts', cascade="all, delete-orphan")),
'topics':relation(TopicAssociation, lazy=False, private=True,
association=Topic, backref='post')
}, order_by=[desc(posts_with_ccount.c.datetime)])

树形评论
映射如下:
   # comment mapper.  This mapper is handling a hierarchical relationship on itself,
# and contains
# a lazy reference both to its parent comment and its list of child comments.
mapper(Comment, tables.comments, properties={
'id':tables.comments.c.comment_id,
'post':relation(Post, lazy=True,
backref=backref('comments', cascade="all, delete-orphan")),
'user':relation(user.User, lazy=False,
backref=backref('comments', cascade="all, delete-orphan")),
'parent':relation(Comment,
primaryjoin=tables.comments.c.parent_comment_id==tables.comments.c.comment_id,
foreignkey=tables.comments.c.comment_id, lazy=True, uselist=False),
'replies':relation(Comment,
primaryjoin=tables.comments.c.parent_comment_id==tables.comments.c.comment_id,
lazy=True, uselist=True, cascade="all"),
})

很多时候我们需要一次性获取对应一个文章的所有评论,可以用一条 select 先把数据取出,然后手动建立树形结构:
# we define one special find-by for the comments of a post, which is going to make its own
# "noload" mapper and organize the comments into their correct hierarchy in one pass. hierarchical
# data normally needs to be loaded by separate queries for each set of children, unless you
# use a proprietary extension like CONNECT BY.
def find_by_post(post):
"""returns a hierarchical collection of comments based on a given criterion.
uses a mapper that does not lazy load replies or parents, and instead
organizes comments into a hierarchical tree when the result is produced.
"""
q = session().query(Comment).options(noload('replies'), noload('parent'))
comments = q.select_by(post_id=post.id)
result = []
d = {}
for c in comments:
d[c.id] = c
if c.parent_comment_id is None:
result.append(c)
c.parent=None
else:
parent = d[c.parent_comment_id]
parent.replies.append(c)
c.parent = parent
return result

Comment.find_by_post = staticmethod(find_by_post)
分享到:
评论
1 楼 xlp223 2007-06-12  
好,需要这样的例子。自己用只能是从文档中获取一些,高级的用法,需要花时间看源码,这是一个问题。

相关推荐

    wtforms-sqlalchemy:用于SQLAlchemy的WTForms集成

    examples/flask包含一个使用Flask的examples/flask 。特征提供SelectField与SQLAlchemy模型的集成wtforms_sqlalchemy.fields.QuerySelectField wtforms_sqlalchemy.fields.QuerySelectMultipleField 使用wtforms_...

    PyPI 官网下载 | SQLAlchemy-Api-Handler-0.1.12.tar.gz

    4. **示例**:有时,开发者会提供 `examples` 或 `samples` 目录,包含演示如何使用库的简单脚本或应用。 5. **安装文件**:通常会有 `setup.py` 文件,这是一个 Python 脚本,用于构建、安装和打包项目。它定义了...

    OpenAlchemy:使用OpenAPI规范定义SQLAlchemy模型

    将OpenAPI架构转换为SQLAlchemy模型。 支持OpenAPI 3.0和3.1。 在线编辑器入门,它将指导您使用现有的OpenAPI规范定义数据库架构,并提供使用pip安装模型的方法: 安装 python -m pip install OpenAlchemy # To ...

    pylidc:使用 sqlalchemy 的 LIDC 数据集对象关系映射

    - `examples/`: 示例代码,展示了库的具体用法。 通过pylidc库,研究者和开发者可以方便地访问和分析LIDC数据集中的CT扫描图像,进行肺癌检测、分割、特征提取等各种任务,从而推动医学影像分析领域的研究。同时,...

    mariadb-sqla-docker-setup:使用SQLAlchemy和Docker的简单MariaDB数据库设置

    mariadb-sqla-docker-setup ... 尽管仍在开发中,但在./setup_examples目录中有一些设置示例,可以通过基本的模式操作将SQLAlchemy连接到容器化数据库。 在同一个文件夹中可以找到关于它们的更详细的自述文件。

    PyPI 官网下载 | WTForms-Alchemy-0.7.3.tar.gz

    - examples/目录:可能包含一些使用WTForms-Alchemy的示例代码。 在使用WTForms-Alchemy时,你需要先安装这个库,可以通过Python的pip工具来完成: ``` pip install WTForms-Alchemy ``` 然后,在你的应用中导入并...

    examples:数据摄取示例

    - **数据库连接示例**:可能是SQLAlchemy或JDBC的使用,演示如何连接和查询关系型数据库。 - **文件处理示例**:可能包括CSV、JSON等文件的读写,使用Python的csv或json模块,或者其他语言的相应库。 - **日志处理**...

    CodeExamples:代码示例

    9. **数据库操作**:SQL查询语言的使用,ORM(对象关系映射)框架如Hibernate、 SQLAlchemy,以及数据库连接池的管理,都是数据库操作相关的知识点。 10. **测试与调试**:单元测试、集成测试、断言的使用,以及...

    flask-examples:Flask示例应用

    它采用微框架的设计思想,允许开发者自由选择各种扩展来增强功能,如SQLAlchemy用于数据库操作,Jinja2用于模板引擎,WTForms用于表单处理等。Flask的核心设计简洁,易于上手,适合构建小型到中型的Web应用。 **二...

    Django-Flask-Examples:Django 中功能示例和实现的存储库

    本项目名为"Django-Flask-Examples",是针对两种主流的Python Web框架——Django和Flask的实例集合,旨在帮助开发者更好地理解和掌握这两种框架的特性与用法。 Django是一个强大的、成熟的Web框架,采用MTV(Model-...

    Python for Unix and Linux System Administration

    Each chapter in Python for Unix and Linux System Administration presents a particular administrative issue, such as concurrency or data backup, and presents Python solutions through hands-on examples....

    Flask-0.2.tar.gz

    7. **扩展机制**:Flask 的强大之处在于其扩展性,允许通过第三方扩展添加更多功能,如 SQLAlchemy(数据库支持)、Flask-SQLAlchemy、Flask-WTF(表单处理)等。 **Flask-0.2 包含的文件** 由于提供的压缩包文件...

    Flask-0.12.tar.gz

    - `examples`目录:可能包含一些示例应用,展示Flask的基本用法和特性。 - `LICENSE`:开源许可证文件,说明了使用Flask的法律条款。 - `CHANGES`或`CHANGELOG`:记录了Flask 0.12相对于前一版本的改动和更新。 总...

    Python-Python用SQL语句生成戏法

    Python中常用的数据库接口是`sqlite3`(针对SQLite数据库)和`psycopg2`(针对PostgreSQL),但也有更通用的接口如`DB-API`(Python Database API规范)和ORM(对象关系映射)框架,比如`SQLAlchemy`。这些工具允许...

    apscheduler-release 3.3.1.post4

    - SQLAlchemy,支持任何SQLAlchemy支持的关系型数据库管理系统(RDBMS)。 - 内存,即将任务保存在内存中,这种方式不支持任务状态的持久化。 - MongoDB,一种NoSQL数据库。 - Redis,一种内存中的数据结构存储系统...

    Flask-1.0.tar.gz

    8. **扩展支持**: 如SQLAlchemy(ORM)、Flask-WTF(表单处理)、Flask-SQLAlchemy(简化数据库操作)等。 **Flask-1.0中的文件结构** 解压后的"Flask-1.0"目录可能包含以下部分: - `flask`: 框架的核心源代码。 -...

    Python库 | kaiubwe1-2.0.5.tar.gz

    3. 数据库操作:用于连接和操作数据库,如SQLAlchemy或PyMySQL。 4. 并发和异步:用于实现高效的并发操作,如asyncio和gevent。 5. 工具包:提供通用功能,如logging和os。 不过,由于kaiubwe1的具体用途并未在标题...

    Flask-1.0.4.tar.gz

    Flask的插件生态系统也非常丰富,如Flask-SQLAlchemy用于数据库操作,Flask-WTF用于表单处理,Flask-Login用于用户登录状态管理等。 安装Flask-1.0.4,可以先解压文件,然后在命令行中导航到解压后的目录,执行`...

    Python库 | porter-db-0.0.4.tar.gz

    在Python的生态系统中,有许多数据库库如SQLAlchemy、PyODBC、psycopg2等,而porter-db可能是为了提供更简单易用的接口或是针对特定场景进行优化。 Python 数据库库是用于与各种关系型数据库(如MySQL、PostgreSQL...

    股票数据(沪深)爬虫和选股策略测试框架

    可以使用pandas的to_csv函数或者SQLAlchemy等库与数据库进行交互。 4. **数据分析模块**:对股票数据进行统计分析,比如计算平均值、标准差、趋势分析等,这有助于理解股票市场的走势。 5. **选股策略**:提供接口...

Global site tag (gtag.js) - Google Analytics