【问题标题】:Building dynamic SQL queries with psycopg2 and postgresql使用 psycopg2 和 postgresql 构建动态 SQL 查询
【发布时间】:2017-01-12 22:25:05
【问题描述】:

我不确定最好的解决方法,或者我是否只是要求过一种比应有的更轻松的生活。我有一个 Web 应用程序的后端,我喜欢用原始 SQL 编写所有查询。例如获取特定的用户个人资料,或一些用户我有这样的查询:

SELECT accounts.id,
    accounts.username,
    accounts.is_brony,
WHERE accounts.id IN %(ids)s;

这真的很好,因为我可以获得一个用户配置文件,或者多个具有相同查询的用户配置文件。现在我真正的查询实际上是将近 50 行。此配置文件有很多连接和其他条件。

假设我想从用户个人资料中获取所有相同的信息,但不是获取特定的用户 ID,而是想获取单个随机用户?我认为复制粘贴 50 行代码只是为了修改最后两行是没有意义的。

SELECT accounts.id,
    accounts.username,
    accounts.is_brony,
ORDER BY Random()
LIMIT 1;

有没有办法在构建查询时使用某种继承,以便最后我可以修改几个条件,同时保持核心相似性相同?

我确信我可以通过连接字符串等来管理它,但我很好奇是否有更广泛接受的方法来处理这种情况。 Google 让我失望了。

【问题讨论】:

  • 子查询?类似select * from (<core query here>) as t order by random() limit 1;
  • 这是有道理的。将查询粘贴到子查询中是否会对性能产生重大影响?当我有一点时间时,我会尝试自己测试它。
  • 这取决于“核心查询”和查询规划器。
  • 我将通过 postgres explain 运行两者,看看它会吐出什么

标签: python sql postgresql psycopg2


【解决方案1】:

规范的答案是创建一个视图并在查询中使用不同的WHEREORDER BY 子句。

但是,根据您的查询和表,对于您的特殊情况,这可能不是一个好的解决方案。

使用WHERE accounts.id IN (1, 2, 3) 的查询速度极快,使用ORDER BY random() LIMIT 1 可能执行得非常慢。在这种情况下,您必须针对第二个要求提出不同的查询。

【讨论】:

  • 谢谢。这就是我现在基本上所做的。我只需要使用大量虚拟数据来测试结果,以确保不会有未来的性能问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 2016-09-26
  • 2018-08-04
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多