1

我正在为一个站点编写一个类似论坛的组件,它的用例与 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 个以上的属性时,这可能会变得非常麻烦。

4

4 回答 4

3

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

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

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

于 2013-04-12T01:14:24.587 回答
2

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

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

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

总的来说,斯蒂芬施密特对 ORM 提出了一个不错的理由,但我认为有一个快乐的中间立场。

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

免责声明:我是 PyORMish 的作者

于 2013-04-14T20:34:20.643 回答
2

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

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

然后,您甚至可能继续其他项目,其中选择了另一个 ORM,并且您也必须了解该 ORM 的来龙去脉......arg。

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

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

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

祝你好运。

于 2013-04-14T21:26:55.043 回答
1

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

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

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

于 2013-04-12T01:50:20.623 回答