【问题标题】:If you're not using an ORM, what is an efficient way to handle your boilerplate CRUD?如果您不使用 ORM,那么处理样板 CRUD 的有效方法是什么?
【发布时间】:2013-04-04 09:29:37
【问题描述】:

我正在为一个网站编写一个类似论坛的组件,它的用例与 reddit 或 quora 之类的东西非常相似,其中创建了主题、帖子、群组等内容。我正在使用 python 和 sqlalchemy 核心,但仍在争论我是否应该只使用 ORM。我不想使用它的真正原因是避免处理其他组件,因为我被告知生成的查询可能会导致问题,并且随着事情的发展,无论如何您都必须处理原始 sql 以进行优化.

对于那些不使用 ORM 来处理所有繁琐的 CRUD 和数据编组的人,我很好奇,你是把它全部写出来还是有其他方法?您如何处理繁琐的数据编组?有没有更好的方法来获取结果对象并简单地执行以下操作:

result = user_dao.get_user(userid)
user.name = result.name
user.email = result.email
user.passwd = result.password_hash
[...]

对于某些对象/实体,当有 15 个以上的属性时,这会变得非常麻烦。

【问题讨论】:

  • @Rapptz 抱歉“链接转储”,但打开的聊天很少,我想我会知道的,问一个问题(以前似乎没有人介意)......我没有我认为没有人会介意,你们在那里发布的随机内容,比如hippos taking bowel-movements 的视频,
  • @Doorknob random tweets 和 shock site 是关于一个男人伸展自己的故事。似乎没有人介意这些,但我想发布一个关于 ORM 和 python 的问题真的越界了“离题”。
  • 虽然链接转储不好,但问题本身并非如此。所以,点个赞吧。
  • @Bill Karwin 我特别想听听你是如何处理这个问题的,因为你听起来在没有 ORM 的情况下相处得很好

标签: database database-design sqlalchemy


【解决方案1】:

除了运行选择/更新/等语句之外,还有很多理由使用 ORM。例如,它允许您将自定义功能绑定到应用程序中的记录,它可以防止 SQL 注入,它允许您更有效地迁移到模型后面的新类类型,以及许多其他事情。

是的,在某些情况下,您可能需要为应用程序编写自定义 SQL,但使用 ORM 中的连接功能,这并不常见。我知道 DBIx for Perl 提供了“虚拟”类型,您可以在其中将自定义 select 语句放入类中,并且仍然能够编写与该对象相关联的方法。

将方法与您选择的项目联系起来的能力提高了代码的干性。结合防止 SQL 注入,我建议您尝试使用 ORM,并且只有在您有充分理由的情况下才使用 ORM。无论如何,你用来处理 CRUD 和数据编组的任何东西最终都会成为一个新的“ORM”,那么为什么不让其他人为你做这些艰苦的工作呢?

【讨论】:

  • “绑定参数”或其他数据库驱动程序参数替换将防止 SQL 注入,而无需 ORM。
  • 我假设这是 ORM 在后台使用的,但它可以防止您必须完成整个准备绑定,从而允许您编写更少的代码。
【解决方案2】:

这个问题似乎不值得所有的反对。我认为作者在这里有合理的担忧。

我个人选择了 ORM 混合。像 SQL Alchemy 这样的东西对于我想要完成的事情来说往往有点过于沉重,而且它并不总是能产生最有效的查询。我完全理解你为什么会犹豫。

从多个表中获取字段时尤其如此。当我第一次开始使用 SQL Alchemy 时,我发现加入多个 SELECT 语句是一个艰难的决定。从那时起,我就开始避开传统的 ORM。

Stephen Schmidt 总体上针对 ORM 提出了decent case,但我认为有一个快乐的中间立场。

也许看看PyORMish?它真的很新,但经过很好的测试。它不是真正的 ORM(因此称为“ish”),但它减少了样板代码,同时在需要时提供对原始 SQL 的简单访问。

免责声明:我是 PyORMish 的作者

【讨论】:

    【解决方案3】:

    我怀疑反对票来自我不是其中之一的 ORM 粉丝。我是一名专业的软件工程师,并且使用过许多 ORM,尤其是。休眠。尽管创建 ORM 工具是为了减轻数据库编码工作的水平,而且在某些情况下确实如此,但我发现自己在大型项目中遇到了重大问题。

    如果我已经对数据库和 SQL 了如指掌,为什么还要添加另一个第三方(我必须全部了解),它们之间必须以通用方式工作,并希望它以高效且有效的方法?如果不是,我必须在高处和低处寻找一些低劣的解决方案来强迫它做我想做的事情。

    然后你甚至可能会继续选择另一个 ORM 的其他项目,你也必须了解那个 ORM 的来龙去脉.......arg.

    我的偏好是代码生成。像CodeSmith 这样的东西是一个很棒的工具,你可以学习一次并应用于几乎任何东西。您可以编写自己的高效代码以按照您想要的方式工作,例如一个表的 CRUD,然后将其转换为一个模板,该模板将在几秒钟内为 100 个表生成相同的 CRUD。

    我从表定义开始我的应用程序,然后为 CRUD 存储过程运行我的模板,然后我有使用这些存储过程的直接 ADO.Net 创建 DAL 的模板,然后是创建 MVC 模型、BAL、控制器和意见。砰!我有一个来自数据库的完全可用的应用程序。然后我会根据最终结果进行定制。

    我还设置了我的模板以使用“部分”类,因此我生成的大部分代码和自定义代码是分开的,因此我可以随时重新生成代码,我想对模板进行更改以解决问题或添加功能,等等。添加一项功能(例如为大型列表分页)并在几分钟内将其应用于 100 多个表是非常甜蜜。

    祝你好运。

    【讨论】:

      【解决方案4】:

      好吧,如果您使用 ORM,那么您在优化时会处理原始 SQL。另一方面,如果没有 ORM,您将在编写新代码、调试旧代码、测试功能和更改数据库方案时处理原始 SQL。那是完全不同的。 ORM 可以帮你解决很多问题。做一个男人,面对现实:你不想学习另一种技术,你在找借口。

      许多 ORM 优化了您的 SQL,它们保护您免受多种攻击类型的侵害,并且它们代表了您的数据模型的新抽象级别。

      相信我,您不会仅仅因为重命名列就搜索数千个旧的硬编码 SQL 查询...

      【讨论】:

      • 哦,我不打算使用手写查询,而是 sqlalchemy expression language。它基本上是这样的语句:“user.select(whereclause = (table.c.id = x)).execute()”,它生成 sql 查询。我正计划创建一堆 DAO 对象并使用这些类型的对象实现table gateway pattern。
      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多