简短的问题
连接到 PostgreSQL 数据库时,Django 过滤器调用返回的列表的默认顺序是什么?
背景
我自己承认,我had在应用程序层做了一个糟糕的假设,即返回列表的顺序将是恒定的,即不使用“order_by”。我查询的项目列表不按字母顺序或任何其他顺序排列商榷命令。人们认为它保持与添加到数据库中的顺序相同。
这个假设对于数百个查询都是成立的,但是当顺序在不知不觉中发生更改时,我的应用程序报告了失败。据我所知,在这段时间里,这些记录都没有被触及,因为我是唯一维护数据库的人。更令人困惑的是,当在 Mac OS X 上运行 Django 应用程序时,它仍然按预期工作,但在 Win XP 上,它改变了顺序。 (请注意,上述数百个查询是在 Win XP 上进行的)。
对此的任何见解都会有所帮助,因为我在 Django 或 PostgreSQL 文档中找不到任何解释操作系统差异的内容。
调用示例
required_tests = Card_Test.objects.using(get_database()).filter(name__icontains=key)
EDIT
今天与我的一些同事交谈后,我得出了与 Björn Lindqvist 相同的答案。
回想起来,我确实理解为什么这种做法经常犯错。使用 ORM Django、sqlalchemy 或其他工具的好处之一是您可以编写命令,而无需知道或理解(详细)它所连接的数据库。诚然,我恰好是这些用户之一。然而,另一方面,如果不详细了解数据库,调试这样的错误是相当麻烦的,并且可能是灾难性的。
有无默认订单,这一点怎么强调都不为过,因为每个人都做错了。
数据库中的表不是普通的 html 表,它是一组无序的元组。它常常让只使用 MySQL 的程序员感到惊讶,因为在该特定数据库中,由于它没有利用一些高级优化技术,行的顺序通常是可预测的。例如,不可能知道将返回哪些行或其在以下任何查询中的顺序:
select * from table limit 10
select * from table limit 10 offset 10
select * from table order by x limit 10
在最后一个查询中,只有当列 x 中的所有值都是唯一的时,顺序才是可预测的。只要满足 select 语句的条件,RDBMS 就可以按其喜欢的任何顺序返回任何行。
尽管您可以在 Django 级别添加默认排序,这会导致它向每个非排序查询添加 order by 子句:
class Table(models.Model):
...
class Meta:
ordering = ['name']
请注意,如果由于某种原因您不需要有序的行,这可能会拖累性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)