确保SQLAlchemy不会重复使用数字ID

时间:2013-12-13 17:07:04

标签: python sqlalchemy

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

例如,如果我有一些来自1-6的ID的内容,然后删除ID为4的内容,我仍然希望添加的下一个内容的ID为7而不是4(因为它当前发生)。 会话重置后可以重用ID(或不重要,无论哪种方式都无关紧要)。

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

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

1 个答案:

答案 0 :(得分:3)

这是一个特定于RDBMS的功能,而不是SQLAlchemy需要关注的功能。

通常数据库将使用单调递增的ID(新值高于先前的值,通常为+1,但步长更大)。

这里唯一真正的例外是SQLite;它会为您提供最高的当前使用的值加一。这意味着如果从表中删除MAX(id),则该ID可能会重新用于将来的行插入。请参阅SQLite autoincrement documentation。请注意,您在帖子中声称的行为实际上并未发生;选择MAX(rowid) + 1,或改为使用SELECT seq + 1 FROM sqlite_sequence WHERE name=<tablename>;

您可以通过为表格设置sqlite_autoincrement=True来切换到正确的自动增量(永远不会重复使用值)。请参阅specific dialect documentation

如果您计划使用Oracle作为后端,还需要explicitly add a Sequence()到需要自动增量的列。