私はどのようにデータベースではないコードの角度から重複する行を積極的に避けるには?
CREATE TABLE `tb_user_portrait` (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'primary key',
user_id BIGINT NOT NULL DEFAULT 0 COMMENT 'custormer id',
portrait_hash CHAR(255) NOT NULL DEFAULT '' COMMENT 'portrait image hash',
is_valid TINYINT NOT NULL DEFAULT 1 COMMENT 'validation flag of this row',
primary key(id)
)
、テーブルには、顧客の頭の肖像画を保存するtb_user_portrait
呼ばれ、そのスキーマが非常に簡単に見え得る顧客は頭を数回肖像画アップロードすることができるので、私は、任意の一意のキーを設定しないでください。ただし、各ユーザーは有効なポートレートを1つしか持たないと仮定されています(つまり、それぞれ1つのis_valid=1
レコードしか持てません)。私が最初に有効なレコードを見つけると、無効な設定が
アップロード操作に対処するための私のコードは、あまりにも
def upload(user_id, portrait_hash, is_valid=1):
# find the last is_valid=1 records, and set invalid
portrait = DBSession().query(UserPortrait).\
filter(UserPortrait.user_id == user_id).\
filter(UserPortrait.is_valid == 1).\
scalar()
if portrait:
portrait.is_valid = 0
DBSession().add(portrait)
# create new valid portrait and save it to db
new_portrait = UserPortrait(
user_id=user_id,
portrait_hash=portrait_hash,
is_valid=is_valid)
DBSession().add(new_portrait)
DBSession().commit()
シンプルですが、私はいつもMultipleRowsFound
に遭遇し、複数の記録(is_valid=1
がそこにいます)をデータベースに格納します。
ところで、私はSQLAlchemyを使用し、session.autoflush
をオンにします。
なぜそれが起こるのだろうか?これを避けるためのベストプラクティスはありますか? SQLAlchemyのから