これに関する私の主な目標は、リビジョン履歴とジャーナリングの実装をより簡単にすることです。
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'),
)
2 人のユーザーが同時に投稿を作成しようとして同じ post_id を作成するという問題なしに、revision_id が 1 で post_id が max(post_id) + 1 の新しい投稿を作成することは可能でしょうか?
このシステムの利点は、投稿履歴 (および差分) が非常に簡単になることです。誰かが投稿を変更したいときはいつでも、元の投稿と同じ 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 に翻訳しただけだからです。