我的主要目标是使实施修订历史和日记更容易。
我发现自己想知道是否有可能使用 Flask-SQLAlchemy(或直接使用 SQL)来为 mysql 获取自动递增的非唯一整数。 我发现这个堆栈溢出帖子与我想要做的很接近,但问题集中在主键上。例如,如果我的表有这些列,
revision_id = db.Column(db.Integer, nullable=False)
post_id = db.Column(db.Integer, nullable=False)
__table_args__ = (
PrimaryKeyConstraint('post_id', 'revision_id'),
)
是否可以创建一个 revision_id 为 1 且 post_id 为 max(post_id) + 1 的新帖子,而不会出现两个用户同时尝试创建帖子并创建相同 post_id 的问题?
这个系统的优点是它使发布历史(和差异)非常简单。每当有人想修改帖子时,我都会使用与原始帖子相同的 post_id 并增加 revision_id (现在我正在输入这个,有同样的问题)。
更新:
Sylvain Leroux让我走上了解决问题的正确道路。我需要将两个表都设置为 sqlalchemy 中的主键。如果 sqlalchemy 中有多个主键,它不会假定它们是唯一的。这是我目前的定义,
revision_id = db.Column(db.Integer, primary_key=True, nullable=False, autoincrement=False, default=1)
post_id = db.Column(db.Integer, primary_key=True, nullable=False, autoincrement=True)
__table_args__ = (
PrimaryKeyConstraint('post_id', 'revision_id'),
)
产生这个 SQL
CREATE TABLE `post` (
revision_id INTEGER NOT NULL,
post_id INTEGER NOT NULL AUTO_INCREMENT,
PRIMARY KEY (post_id, revision_id),
)
这使我可以在有和没有 post_id 的情况下插入。
所有功劳归功于Sylvain Leroux,因为我只是将他的答案翻译到 SQLAlchemy。