我最近做了很多研究,比较使用金字塔和 SQLAlchemy 以及在 Django 中保留当前的应用程序。这本身就是一场辩论,但我不是来讨论这个的。
我想知道的是,为什么 SQLAlchemy 被普遍认为比 Django ORM 更好?几乎每一个,如果不是每一个,比较我发现这两个青睐 SQLAlchemy。我认为性能是一个很大的问题,因为 SQLAlchemy 的结构使它能够更顺利地转换为 SQL。
但是,我也听说,对于更难的任务,Django ORM 几乎不可能使用。我想知道这个问题有多严重。我一直在阅读切换到 SQLAlchemy 的原因之一是当 Django ORM 不再适合您的需要时。
因此,简而言之,是否有人可以提供一个 SQLAlchemy 可以执行的查询(不一定是实际的 SQL 语法) ,但是 Django ORM 不可能不添加额外的原始 SQL?
更新 :
自从我第一次提出这个问题以来,我就注意到这个问题得到了相当多的关注,所以我想多说两句。
最后,我们最终使用了 SQLAlchemy,我必须说我对这个决定很满意。
我重新讨论这个问题是为了提供 SQLalchemy 的另一个特性,到目前为止,我还没能在 Django ORM 复制这个特性。如果有人能提供一个如何做到这一点的例子,我很乐意收回我的话。
假设您希望使用一些 postgreql 函数,比如贼() ,它提供模糊比较(参见: 使用 PostgreSQL 快速查找类似的字符串-tl; dr 输入两个字符串返回百分比相似度)。
我搜索了一下如何使用 Django ORM 完成这项工作,除了使用原始 sql 之外,没有发现其他任何东西,这一点从他们的文档 https://docs.djangoproject.com/en/dev/topics/db/sql/中可以明显看出。
也就是说。
Model.objects.raw('SELECT * FROM app_model ORDER BY \
similarity(name, %s) DESC;', [input_name])
然而,SQLchemy 具有 func () ,如下所述: http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.func
from sqlalchemy import desc, func
session.query(Model).order_by(func.similarity(Model.name, input_name))
这允许您为任何已定义的 sql/postgreql/etc 函数生成 sql,而不需要原始 sql。