SQLAlchemy db.session.query() 与 model.query

2024-01-03

对于简单的返回所有结果查询,是否应该优先选择一种方法?我可以在网上找到两者的用途,但无法真正找到任何描述差异的内容。

db.session.query([my model name]).all()

[my model name].query.all()

我觉得 [我的模型名称].query.all() 更具描述性。


很难给出明确的答案,因为回答这个问题存在高度的偏好主观性。

从一个角度来看,db.session 是需要的,因为第二种方法要求将其作为附加步骤合并到模型中 - 默认情况下它不作为基类的一部分存在。例如:

Base = declarative_base()
DBSession = scoped_session(sessionmaker())
class User(Base):
   __tablename__ = 'users'

   id = Column(Integer, primary_key=True)
   name = Column(String)
   fullname = Column(String)
   password = Column(String)
session = Session()
print(User.query)

该代码失败并出现以下错误:

AttributeError:类型对象“用户”没有属性“查询”

你需要做这样的事情:

class User(Base):
   __tablename__ = 'users'

   id = Column(Integer, primary_key=True)
   name = Column(String)
   fullname = Column(String)
   password = Column(String)
   query = DBSession.query_property()

然而,也有人认为,仅仅因为默认情况下未启用它,并不意味着它作为启动查询的合理方式无效。此外,在 Flask-sqlalchemy 包(简化了 sqlalchemy 与 Flask Web 框架的集成)中,这已经作为 Model 类的一部分为您完成(doc) http://flask-sqlalchemy.pocoo.org/2.1/api/#flask.ext.sqlalchemy.Model。将查询属性添加到模型中也可以在 sqlalchemy 教程中看到(doc) http://flask.pocoo.org/docs/0.12/patterns/sqlalchemy/:

class User(object):
   query = db_session.query_property()
   ....

因此,人们可以争论任何一种方法。

当我从单个表中进行选择时,我个人更喜欢第二种方法。例如:

serv = Service.query.join(Supplier, SupplierUsr).filter(SupplierUsr.username == usr).all()

这是因为它的行长度较短并且仍然易于阅读。

如果我从多个表中进行选择或指定列,那么我将使用模型查询方法,因为它从多个模型中提取信息。

deliverables = db.session.query(Deliverable.column1, BatchInstance.column2).\
    join(BatchInstance, Service, Supplier, SupplierUser). \
    filter(SupplierUser.username == str(current_user)).\
    order_by(Deliverable.created_time.desc()).all()

也就是说,可以在始终使用 session.query 方法时进行反论证,因为它使代码更加一致,并且当从左到右阅读时,读者立即知道他们要读取的 sqlalchemy 指令将在之前被查询精神上吸收所涉及的表和列。

归根结底,你的问题的答案是主观的,没有正确的答案,而且任何一种方式对代码可读性的好处都是很小的。我看到的唯一一个强大的好处是,如果您从许多表中进行选择,则不要使用模型查询,而是使用 session.query 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy db.session.query() 与 model.query 的相关文章

随机推荐

  • 将分数转换为十六进制

    假设您有一个数字 28 5 您需要将其转换为十六进制 28 是 1C 29 是 1D 但是 28 5 会是什么呢 你甚至可以转换它吗 我问这个是因为我正在用 JavaScript jsyk 制作一个转换器 Use n toString 16
  • 将 php 脚本作为守护进程运行

    我需要运行一个 php 脚本作为守护进程 等待指令并执行操作 cron 作业不会为我做这件事 因为指令到达后需要立即采取行动 我知道由于内存管理问题 PHP 并不是守护进程的最佳选择 但由于各种原因 我在这种情况下必须使用 PHP 我遇到了
  • 在C中逐行读取文件

    Preface 这道题是关于逐行读取文件 并将每一行插入到一个链表中 我已经编写了链表的实现 并测试了insert 手动功能 这有效 我还编写了从文件中读取文本并将其写出的代码 同样 这也有效 好的 这是我的问题 我怎样才能合并这些概念 以
  • Dart:将十进制转换为十六进制

    我一直在寻找一种在 Dart 编程语言中将十进制数转换为十六进制格式的方法 The hex encode方法中的HexCodec例如 类无法转换十进制 1111 其十六进制值为 457 而是给出异常 FormatException 无效字节
  • 我应该在函数中抛出 IllegalArgumentException 吗?

    我正在构建一个包含大量计算的科学软件 当然参数可能有错误的长度等 所以我使用IllegalArgumentException类 因为它似乎是这个问题的正确名称 但我应该把throws IllegalArgumentException在函数定
  • 如何使用 python 中的循环创建多个目录?

    我想用循环创建 10 个目录 我尝试了以下代码 import os pathname 1 directory C Directory Path Name str pathname while pathname lt 11 if not os
  • 右移和有符号整数

    在我的编译器上 以下伪代码 值替换为二进制 sint32 word 10000000 00000000 00000000 00000000 word gt gt 16 产生一个word位字段如下所示 11111111 11111111 10
  • 在tomcat中共享文件夹

    如何使用 tomcat 6 浏览器访问文件夹 我想我需要向 web xml 添加上下文 我想 所以当我导航到http localhost 8080 myfiles http localhost 8080 myfiles我希望看到 c tem
  • 如何在 Windows 上以提升的权限运行脚本?

    我一直在试图弄清楚如何运行一堆都需要提升权限的应用程序 DameWare MSC exe PowerShell exe 和 SCCM Manager Console 等应用程序都在我的日常工作中使用 我现在运行的是Win7 计划最终迁移到W
  • Wp7 键盘支持多少种语言以及如何设置

    我希望为 Windows Phone 7 创建一个翻译应用程序 我不知道如何去做 这里是问题 我想知道当我在文本框中输入文本进行翻译时 我该怎么做 1 假设 我的Windows手机是中文的 如何将其更改为其他语言 例如法语 德语 俄语等 我
  • C 语言的限制输出

    在 C 中 我想将字符串限制为前 8 个字符 例如 我有 char out printf c str 我怎样才能使它只返回前 8 个字符 您可以通过设置格式说明符中的精度来限制长度 printf 8s str 这将打印up to指向的以空字
  • Maven Cobertura 插件未生成coverage.xml

    我试图生成一个coverage xml 以便我可以在Hudson 的Cobertura 插件中引用它 但该文件没有被创建 我已将以下内容添加到我的 POM 中
  • 如何在.net core中使用反射通过名称查找类的名称空间?

    我有一个仅包含类名称的字符串列表 我需要使用 Activator 创建它们的实例 但它们都可以位于不同的命名空间中 类将来可以移动到另一个名称空间中 因此我无法对其进行硬编码 如果您知道永远不会有多个具有相同名称的类型驻留在不同的命名空间中
  • 检测已安装的浏览器,以便 Process.Start("chrome") 不会出错

    我试图让用户选择我的应用程序用来启动网址的浏览器 目前它使用默认浏览器 但有些人想指定不同的浏览器 我想仅显示列表中已安装的浏览器 并且我将像这样启动它们 Process Start chrome url 更多信息 https learn
  • cakephp 复选框显示额外的隐藏字段

    foreach apps as app echo this gt Form gt input Application array type gt checkbox id gt app Application description div
  • Maven 发布:如何跳过部署步骤?

    要发布我正在使用的应用程序maven 发布 插件 此过程中的一个步骤是将版本部署到存储库中 我想避免这一步 但是当我从 pom 文件中删除 distributionManagement 时 出现错误 Deployment failed re
  • 更改端口号后无法在 Visual Studio 中调试?

    我添加了这一行 UseUrls http 5000 使其他主机的客户端能够访问 Web api public static void Main string args var host new WebHostBuilder UseKestr
  • 为什么sbt找不到KafkaUtils?

    我在使用 SBT 编译的代码 来自 Kafka 的 wordCount 中出现此错误 error home hduser sbt project project1 src main scala sparkKafka scala 4 35 o
  • Python:使用已知 URL 但未知驱动器号访问 Windows 映射网络驱动器

    我正在尝试编写一个可以在远程 Linux 服务器上移动和复制文件的 Python 脚本 但是 我不能假设运行该脚本 在 Windows 上 的每个人都会将此服务器映射到同一个字母 我不想提示用户输入正确的盘符 而是想简单地通过服务器的网络
  • SQLAlchemy db.session.query() 与 model.query

    对于简单的返回所有结果查询 是否应该优先选择一种方法 我可以在网上找到两者的用途 但无法真正找到任何描述差异的内容 db session query my model name all my model name query all 我觉得