在SQLalchemy中混合ORM和显式SQL是一种糟糕的做法吗?

在SQLalchemy中混合ORM和显式SQL是一种糟糕的做法吗?,sql,orm,sqlalchemy,Sql,Orm,Sqlalchemy,我发现,对于设置数据库模式和运行简单查询,我更喜欢使用SQLAlchemy的ORM。但是,有时对于涉及复杂联接的查询,使用普通SQL和引擎执行更容易(我认为)更可读 这种方法有什么明显的错误吗?在软件开发中,任何方法都没有本质上的“错误”,除非它不起作用。几乎每件事都有权衡。现在,很明显,有一些事情大多数人都认为是不好的做法(比如使用GOTOs,仍然有一些人会在那里提出论点),但基本上之后的一切都只是意见。StackOverflow试图远离“意见”(或者至少明确承认他们是这样的)。有人会说使用O

我发现,对于设置数据库模式和运行简单查询,我更喜欢使用SQLAlchemy的ORM。但是,有时对于涉及复杂联接的查询,使用普通SQL和
引擎执行
更容易(我认为)更可读


这种方法有什么明显的错误吗?

在软件开发中,任何方法都没有本质上的“错误”,除非它不起作用。几乎每件事都有权衡。现在,很明显,有一些事情大多数人都认为是不好的做法(比如使用GOTOs,仍然有一些人会在那里提出论点),但基本上之后的一切都只是意见。StackOverflow试图远离“意见”(或者至少明确承认他们是这样的)。有人会说使用ORM根本就是一种“坏习惯”或“反模式”

因此,不可能给出一个笼统、全面、正确的答案。然而,这里有一些事情需要考虑:

  • 使用engine.execute编写SQL所需的时间比使用ORM所需的时间多或少(请记住,如果需要,您可能还需要编写一些代码来帮助将结果转换为您自己的对象模型)
  • 假设您必须对此查询进行更改,那么修改原始SQL会比修改ORM等价物花费更多或更少的时间吗
  • 基本上,上面的问题是相同的,但是现在考虑一下你的团队中的其他人是否正在做出改变。也许有人根本不熟悉SQLAlchemy模型。也许把它作为一个存储过程放在一起会更好
  • 您正在编写的软件是否设计为能够在多个数据库上运行?在这种情况下,原始SQL更可能使用特定于数据库方言的语法,这可能会破坏其他数据库。如果有必要,这也可能会改变您将来迁移到其他数据库的能力(或者使用其他数据库(如SQLite)对其运行快速测试)

  • 正如您所看到的,一个项目选择一种方式是完全合法的,而另一个项目选择另一种方式是完全合法的。在同一个项目中使用这两种方法也是合法的。SQLAlchemy本身使您能够选择如何使用它,并利用这种选择以最适合您和您的具体情况的方式使用它。

    在软件开发中,任何方法都没有本质上的“错误”,除非它不起作用。几乎每件事都有权衡。现在,很明显,有一些事情大多数人都认为是不好的做法(比如使用GOTOs,仍然有一些人会在那里提出论点),但基本上之后的一切都只是意见。StackOverflow试图远离“意见”(或者至少明确承认他们是这样的)。有人会说使用ORM根本就是一种“坏习惯”或“反模式”

    因此,不可能给出一个笼统、全面、正确的答案。然而,这里有一些事情需要考虑:

  • 使用engine.execute编写SQL所需的时间比使用ORM所需的时间多或少(请记住,如果需要,您可能还需要编写一些代码来帮助将结果转换为您自己的对象模型)
  • 假设您必须对此查询进行更改,那么修改原始SQL会比修改ORM等价物花费更多或更少的时间吗
  • 基本上,上面的问题是相同的,但是现在考虑一下你的团队中的其他人是否正在做出改变。也许有人根本不熟悉SQLAlchemy模型。也许把它作为一个存储过程放在一起会更好
  • 您正在编写的软件是否设计为能够在多个数据库上运行?在这种情况下,原始SQL更可能使用特定于数据库方言的语法,这可能会破坏其他数据库。如果有必要,这也可能会改变您将来迁移到其他数据库的能力(或者使用其他数据库(如SQLite)对其运行快速测试)

  • 正如您所看到的,一个项目选择一种方式是完全合法的,而另一个项目选择另一种方式是完全合法的。在同一个项目中使用这两种方法也是合法的。SQLAlchemy本身让您能够选择如何使用它,利用这种选择以最适合您和您的特定情况的方式使用它。

    虽然它没有什么问题,但在某些特定情况下,它实际上可能是最好的方式,一般来说,它是不受鼓励的。使用SQLAlchemy的一个要点是它可以抽象出数据库之间的差异;编写显式SQL可能会不必要地将您绑定到一个数据库。一旦你习惯了,使用ORM查询就像现在编写SQL一样简单。

    虽然它没有什么问题,而且在某些特定情况下,它实际上可能是最好的方法,但通常不鼓励这样做。使用SQLAlchemy的一个要点是它可以抽象出数据库之间的差异;编写显式SQL可能会不必要地将您绑定到一个数据库。一旦你习惯了,使用ORM查询就像现在编写SQL一样简单。

    谢谢你的回答。由于这是一个个人项目,我确信它只会在SQLite上使用,不太可能被其他人阅读,所以我将坚持目前的方法。感谢您的精彩回答。由于这是一个个人项目,我确信它只会在SQLite上使用,不太可能被其他人阅读,所以我将坚持当前的方法。