この質問は、Django のアトミック操作に似ていますか? ただし、Django 1.4 の場合。「生のSQL」に頼らずにこれを行う方法があるかどうか疑問に思っています。私の設定は彼とは少し違うので、説明します。
UserのレコードとUserRecordsという汎用テーブルがあります。UserRecordの定義は次のとおりです。
class UserRecord (models.Model):
"""
User record model for :class:`User` users to keep
aux data like services connected, latest stats, and other accounts.
"""
def __unicode__ (self):
return u"{0}.{1}.{2}.{3}".format(self.user, self.parent, self.key, self.value)
def update_maybe_save (self, val):
if self.value != val:
self.value = val
self.save()
#: :class`User` who owns this record
user = models.ForeignKey("User")
parent = models.CharField(max_length=255, blank=True, null=True, db_index=True)
key = models.CharField(max_length=255, db_index=True)
value = models.TextField(blank=True, null=True)
ご覧のとおり、これは非常に一般的な k/v ストア テーブルであり、オプションの親属性を使用して、レコードをグループ化し、一部の検索を最適化するのに役立ちます。この場合、ユーザーにいくつかのエイリアスを追加したい場合に非常に便利です。
# Inside the User model
def add_alias (self, name):
try:
UserRecord.objects.get(user=self, parent="alias", key=name, value=self.username)
except UserRecord.DoesNotExist:
UserRecord(user=self, parent="alias", key=name, value=self.username).save()
これにより、競合状態が発生し、ユーザーが同じエイリアスを 2 回入力すると、2 つの同一のレコードが作成される可能性があります。次に、UserRecord.objects.get
呼び出しが 2 つあるため、それぞれの呼び出しが失敗します。Django のエラー メールが届き、手動でデータベースを修正します。
ドキュメントには、アトミックに何かを作成できるものは何も見つかりません。他の質問で言及されている生のSQL以外のアイデアはありますか?