【问题标题】:SELECT DISTINCT, ORDER BY created by Django works in MySQL and SQLite, not PostgreSQL由 Django 创建的 SELECT DISTINCT, ORDER BY 在 MySQL 和 SQLite 中工作,而不是在 PostgreSQL
【发布时间】:2011-06-16 23:17:17
【问题描述】:

我刚刚从 mysql 切换到 postgres(耶!)但现在在我的 postgres 服务器上(仅)我收到一个错误:

SELECT DISTINCT, ORDER BY 表达式必须出现在选择列表中

这是同一个查询:

SELECT DISTINCT * FROM table ORDER BY '?'

顺便说一句,这是 django 自动生成的查询。或者,有什么方法可以让 django 真正呈现正确的 sql?

附录

事实证明,无论出于何种原因,在我的 Postgres 8.4 生产服务器上,Django 都消除了错误,而在我的 Postgres 9.0 开发服务器上却没有。我不知道它是否与 Postgres 版本有关,但实际上 Postgreses 和 MySQL 都没有错误

【问题讨论】:

  • 嗯,我可以通过在 pgsql 8.3 上执行 SELECT DISTINCT id FROM table ORDER BY non_select_field 来重现该错误。 9允许吗?我们可以看到您的 django 查询吗?另外,你能澄清一下any way to get django to actually render correct html?
  • 你能告诉我们关于 8.4 和 9.0 的查询吗?我做了一个小测试,在 8.4 和 9.0 都失败了,完全没有区别。
  • 我更仔细地查看了查询及其 SELECT DISTINCT...阳光下的一切... ORDER BY RANDOM()。我可以看到这是依赖于实现的。

标签: python django postgresql migration


【解决方案1】:

我希望所有符合 SQL 标准的 SQL 平台都会引发类似的错误。

这样想。

CREATE TABLE test (
    id INTEGER NOT NULL,
    c CHAR(1) NOT NULL,
    PRIMARY KEY (id, c)
);

INSERT INTO test VALUES 
    (1, 'a'),
    (1, 'z'),
    (2, 'b');

SELECT * FROM test ORDER BY c;

id  c
--  -
1   a
2   b
1   z

现在想想下一条语句的含义。

SELECT DISTINCT id FROM test ORDER BY c;

dbms 应该使用哪个 'c' 值在排序顺序中定位 'id' 1?如果它选择'a',则顺序为'1,2'。如果选择'z',则顺序为'2,1'。

【讨论】:

  • 是的,这完全有道理。但是 django/psycopg2 不应该知道这一点并提出合理的查询吗?我想总是有错误......
  • @Dave:可能是因为某些 dbms 实际上会执行最后一个查询。例如 SQLite3。
  • Catcall,事实证明 mysql 实际上会执行(并返回 1/a // 2/b)。事实证明,这在两台机器上的 postgres 中都不起作用……但由于某种原因,有人取消了错误。
【解决方案2】:

作为@Catcall said,从技术上讲,这条语句在 SQL 中是非法且无意义的。

但是,MySQL 和 SQLite 允许您执行 SELECT DISTINCT id FROM test ORDER BY whatever,而 PostgreSQL 不允许。就这么简单。

MySQL 和 SQLite 使用这种方法可能会产生不确定的结果,我不确定。

不过,如果您通过'?' 订购,应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多