【问题标题】:Sqlalchemy for performing complex queries in Django project用于在 Django 项目中执行复杂查询的 Sqlalchemy
【发布时间】:2011-09-18 18:14:17
【问题描述】:

在 Django 项目中使用 sqlalchemy 执行复杂查询的最佳选择是什么?我找到了 quiet ,但它看起来不像一个有很多用户的项目......有什么建议吗?

原因:我在整个项目中有 30-40 个 RawQueries,维护这些查询很痛苦……我认为 SQLAlchemy 在这种情况下可以提供更好的体验。

更新。

要实现的主要目标是编写一些大型复杂查询,以后可以根据需要对其进行细化:

q = get_big_complex_sqlalachemy_query()
mine = q.filter_by(table.c.created_by_id=1)
closed = q.filter_by(table.c.is_closed=True)

Django 和 SQLAlchemy 最大的问题是事务管理。如果您使用大事务(每个请求一个事务),SQLAlchemy 在您提交它们之前不会看到任何更改(愉快的调试:)。所以我为 SQLAlchemy 编写了自定义连接池来使用 Django 连接。这也不太理想(现在测试中出现了问题,因为 SQLAlchemy 喜欢将每个选择包装在事务中,我仍然不知道如何禁用它),但它看起来更好。

【问题讨论】:

  • 还有没有办法,Django ORM 能胜任?
  • @miku,例如:如何对一张表进行多个联接?像 LEFT JOIN 标签 t1 ... LEFT JOIN 标签 t2?我发现的唯一方法是编写 RawQuery,但正如我所说,看起来 sqlalchemy 可以为此提供更好的方法......至少通过 SQLAlchemy 生成 SQL 并将其传递给 RawQuery。
  • @Vladimir:使用 .extra(tables=['table1', 'table2']) 怎么样?
  • @VladimirMihailenco 你能用 django 把一个链接放到你的 SQLAlchemy 连接池吗?

标签: django sqlalchemy


【解决方案1】:

虽然我不熟悉宁静,但我可以说在 django 中使用 sqlalchemy 的方法是...在 django 中使用 sqlalchemy...!

当我过去在 django 项目中使用 sqlalchemy 时,我通常从外部数据源读取数据(不由 django ORM 管理的数据)。考虑到这一点,我倾向于使用SqlSoup extension,它不需要您明确声明数据的结构。这可能对您也有好处,因为我猜您不想在 2 个不同的 ORM 中两次编写所有模型。

另一个提示:如果您不需要为每个视图使用 sqlalchemy,请不要在设置模块中打开连接。将您的 sqlalchemy 代码(包括连接创建)放在它自己的模块或包中——尽可能保持隔离。仅在真正需要时才导入模块并创建连接。

所有这一切都取决于你的目标是什么。您的查询主要是阅读,还是您也想编写?我真的不知道你想做什么。

【讨论】:

  • 问题已更新。 SqlSoup 很酷,但实际上我可以使用表 = MetaData().reflect(bind=engine) 实现相同的效果。我使用它和自定义映射器到 Django 模型(所以在执行查询后我得到了我的 Django 模型实例)。我对这个解决方案不太满意,但在许多情况下,它肯定比原始查询更进一步。
  • 是的,当然。使用反射可以得到同样的结果。如果你愿意的话,SqlSoup 只是一个捷径。听起来你比我冒险的更深入兔子洞。老实说,过去我通过将sql作为列表手动编写,在满足条件时附加相关部分来完成这种事情。如果真正的问题是如何处理事务处理(在更新后的问题中说明),那就另当别论了。
猜你喜欢
  • 2017-04-05
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多