【发布时间】:2013-08-14 11:26:18
【问题描述】:
我最近一直在做大量研究,研究将 Pyramid 与 SQLAlchemy 结合使用,而不是在 Django 中保留当前应用程序。这本身就是一场完整的辩论,但我不是来讨论这个的。
我想知道的是,为什么普遍认为 SQLAlchemy 比 Django ORM 更好?我发现的几乎每一个(如果不是每一个)比较都支持 SQLAlchemy。我认为性能是一个重要因素,因为 SQLAlchemy 的结构让它更顺利地转换为 SQL。
但是,我也听说对于更难的任务,Django ORM 几乎无法使用。我想弄清楚这可能是一个多么巨大的问题。我一直在阅读切换到 SQLAlchemy 的原因之一是 Django ORM 不再适合您的需求。
因此,简而言之,是否有人可以提供 SQLAlchemy 可以执行的查询(不一定是实际的 SQL 语法),但如果不添加额外的原始 SQL,Django ORM 就不可能完成?
更新:
自从我第一次提问以来,我就注意到这个问题引起了相当多的关注,所以我想多花两分钱。
最后我们最终使用了 SQLAlchemy,我必须说我对这个决定很满意。
我正在重新审视这个问题,以提供 SQLAlchemy 的附加功能,到目前为止,我还无法在 Django ORM 中进行复制。如果有人可以提供如何做到这一点的例子,我很乐意接受我的话。
假设您想使用一些 postgresql 函数,例如similarity(),它提供了一个模糊比较(参见:Finding similar strings with PostgreSQL quickly - 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])
但是,SQLalchemy 有 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/postgresql/etc 函数生成 sql,而不需要原始 sql。
【问题讨论】:
-
sqlalchemy不仅仅是 ORM。 ORM 不能很好地与asyncio配合使用,但sqlalchemy表达式语言可以很好地配合异步代码。
标签: python sqlalchemy django-orm