防止在 PostgreSQL/SQLAlchemy 中重新排序更新的 objects/rows
Prevent re-ordering of updated objects/rows in PostgreSQL/SQLAlchemy
我正在使用 PostgreSQL 并使用 Python3.4 应用程序通过 SQLAlchemy 访问它。
当我从数据库中得到一个仍然存在的 object/row 时,对其进行修改并将其存储回来,该行被移动到 table 的末尾。
我想阻止这种情况。
我希望所有行的顺序与创建时的顺序相同,无论它们更新的频率如何。
您观察到的很可能是没有 ORDER BY
的查询的结果,在这种情况下,行以任意顺序返回。在这种情况下,Postgres 通常(但不一定)按物理顺序检索行。
与@Haleemur 评论的相反,UPDATE
实际上与 PostgreSQL MVCC model. A new row version is written for every update. Only large columns that are stored out-of-line ("TOASTed" 中的 DELETE
和 INSERT
非常相似)不会被重写,除非这些列是已更新。
因此,如果您不 ORDER BY
(您可能应该这样做),行通常会在更新时移至 table 的末尾(根据它们的物理位置),但是可以在没有警告的情况下随时更改,例如由另一个 UPDATE
或 VACUUM
。永远不要依赖物理位置。
I want all rows in the same order like they where created, no matter
how often they are updated.
所以在 table 中添加一个 serial
列并按它排序:
- Auto increment SQL function
CREATE TABLE foo (foo_id serial PRIMARY KEY, foo text);
SELECT * FROM foo ORDER BY foo_id;
我正在使用 PostgreSQL 并使用 Python3.4 应用程序通过 SQLAlchemy 访问它。
当我从数据库中得到一个仍然存在的 object/row 时,对其进行修改并将其存储回来,该行被移动到 table 的末尾。
我想阻止这种情况。
我希望所有行的顺序与创建时的顺序相同,无论它们更新的频率如何。
您观察到的很可能是没有 ORDER BY
的查询的结果,在这种情况下,行以任意顺序返回。在这种情况下,Postgres 通常(但不一定)按物理顺序检索行。
与@Haleemur 评论的相反,UPDATE
实际上与 PostgreSQL MVCC model. A new row version is written for every update. Only large columns that are stored out-of-line ("TOASTed" 中的 DELETE
和 INSERT
非常相似)不会被重写,除非这些列是已更新。
因此,如果您不 ORDER BY
(您可能应该这样做),行通常会在更新时移至 table 的末尾(根据它们的物理位置),但是可以在没有警告的情况下随时更改,例如由另一个 UPDATE
或 VACUUM
。永远不要依赖物理位置。
I want all rows in the same order like they where created, no matter how often they are updated.
所以在 table 中添加一个 serial
列并按它排序:
- Auto increment SQL function
CREATE TABLE foo (foo_id serial PRIMARY KEY, foo text);
SELECT * FROM foo ORDER BY foo_id;