确保 SQLAlchemy 不重复使用数字 ID

Nig*_*ger 3 python sqlalchemy

我正在使用 SQLAlchemy(目前正在 SQLite 上进行测试,但也需要它在其他地方工作)并且我在重用主键 ID 时遇到了问题。

例如,如果我有一些 ID 为 1-6 的内容,然后删除 ID 为 4 的内容,我仍然希望添加的下一个内容的 ID 为 7 而不是 4(就像目前发生的那样)。ID 可以在 Session 重置后重用(或不重用,无论哪种方式都无关紧要)。

我猜这取决于您使用的数据库类型(并且它是自动增量策略/实现),但我需要一种方法来使其至少在 SQLite、mySQL 和 PostgreSQL 中工作(其他不重要但他们也不会受伤)。

任何帮助或指向正确方向将不胜感激!

Mar*_*ers 7

这是 RDBMS 特定的功能,SQLAlchemy 不需要关心它自己。

通常数据库会使用单调递增的 id(新值比之前的值高,通常是 +1,但更大的步长是可能的)。

这里唯一真正的例外是 SQLite;它将为您提供当前使用的最高值加一。这意味着如果您MAX(id)从表中删除,那么该 id 很可能会在以后的行插入中重复使用。请参阅SQLite 自动增量文档。请注意,您在帖子中声称的行为实际上从未发生过;要么MAX(rowid) + 1被挑选,要么SELECT seq + 1 FROM sqlite_sequence WHERE name=<tablename>;被使用。

您可以通过设置sqlite_autoincrement=True表来切换到适当的自动增量(其中值永远不会重用)。请参阅特定的方言文档

如果您计划使用 Oracle 作为后端,您还需要向需要自动递增的列显式添加 aSequence()