3

これに関する私の主な目標は、リビジョン履歴とジャーナリングの実装をより簡単にすることです。

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 に翻訳しただけだからです。

4

1 に答える 1