def update_field(self): '''update_or_createを使った列の更新''' # 実行前に全削除 Store.objects.all().delete() print(Store.objects.count()) # データ登録 s1, c1 = Store.objects.update_or_create( name = 'update_or_create1', hoge = 'fuga1', registered_users = 1, ) dump_sql_postgres() #=> INSERT INTO "store" ("name", "registered_users", "hoge") VALUES ('update_or_create1', 1, 'fuga1') print(c1) #=> True dump_store() #=> {'hoge': 'fuga1', 'registered_users': 1, 'id': 20, 'name': 'update_or_create1'} # defaultsで指定した列・値で更新する s2, c2 = Store.objects.update_or_create( name = 'update_or_create1', hoge = 'fuga1', defaults={ 'hoge': 'fuga2' } ) dump_sql_postgres() #=> PDATE "store" SET "name" = 'update_or_create1', "registered_users" = 1, "hoge" = 'fuga2' # WHERE "store"."id" = 20 print(c2) #=> False dump_store() #=> {'hoge': 'fuga2', 'registered_users': 1, 'id': 20, 'name': 'update_or_create1'}
def update_or_create(self): '''update_or_createでレコードが作成されるタイミング''' # 実行前に全削除 Store.objects.all().delete() print(Store.objects.count()) # created=True s1, c1 = Store.objects.update_or_create( name = 'update_or_create1', registered_users = 2, hoge = 'fuga1', ) print(s1) print(c1) dump_sql_postgres() #=> NSERT INTO "store" ("name", "registered_users", "hoge") VALUES ('update_or_create1', 2, 'fuga1') # created=False s2, c2 = Store.objects.update_or_create( name = 'update_or_create1', registered_users = 2, ) print(s2) print(c2) dump_sql_postgres() #=> UPDATE "store" SET "name" = 'update_or_create1', "registered_users" = 2, "hoge" = 'fuga1' # WHERE "store"."id" = 17 # created=False s3, c3 = Store.objects.update_or_create( name = 'update_or_create1', ) print(s3) print(c3) # created=False s4, c4 = Store.objects.update_or_create( registered_users = 2, ) print(s4) print(c4) # created=True s5, c5 = Store.objects.update_or_create( name = 'update_or_create2', registered_users = 2, ) print(s5) print(c5) # 複数件取れてしまうため、例外が出る # apps.runner.models.MultipleObjectsReturned: get() returned more than one Stores -- it returned 2! s6, c6 = Store.objects.update_or_create( registered_users = 2, ) print(s6) print(c6)
def insert(self): '''INSERT''' # メソッドチェーンでのINSERT Store(name='st1', registered_users=1).save() dump_sql_postgres() #=> INSERT INTO "store" ("name", "registered_users", "hoge") VALUES ('st1', 1, 'fuga') RETURNING "store"."id" # primary keyの確認のために、分割 s = Store(name='st2', registered_users=2) dump_pk(s) #=> None s.save() dump_pk(s) #=> pk:2
def select_for_update(self): '''SELECT FOR UPDATE''' # トランザクション外だとエラーになる # django.db.transaction.TransactionManagementError: select_for_update cannot be used outside of a transaction. # PostgreSQLの場合 with transaction.atomic(using='postgres'): repr(Store.objects.select_for_update().filter(name='st1')) # reprで即時評価 dump_sql_postgres() #=> SELECT * FROM "store" WHERE "store"."name" = 'st1' LIMIT 21 FOR UPDATE # SQLiteの場合、SELECT FOR UPDATEに対応していないため、 # エラーが出ずに`FOR UPDATE`なしのSQLが発行される
def update_record(self): '''1レコードのUPDATE''' # UPDATE元のデータ作成 self.insert() dump_store() #=> {'registered_users': 1, 'hoge': 'fuga', 'name': 'st1', 'id': 1} # 繰り返すと複数件取れてしまうので、1件のみに絞る s = Store.objects.filter(name='st1').first() s.registered_users += 1 s.save() dump_sql_postgres() #=> UPDATE "store" SET "name" = 'st1', "registered_users" = 2, "hoge" = 'fuga' WHERE "store"."id" = 1 dump_store() #=> {'registered_users': 2, 'hoge': 'fuga', 'name': 'st1', 'id': 1}
def update_records(self): '''複数レコードのUPDATE''' # UPDATE元のデータ作成 self.insert() dump_store() #=> {'hoge': 'fuga', 'id': 1, 'registered_users': 2, 'name': 'st1'} # {'hoge': 'fuga', 'id': 2, 'registered_users': 2, 'name': 'st2'} # Fオブジェクトを使って、複数行のregistered_users列をインクリメント Store.objects.values().filter(name__istartswith='st').update(registered_users=F('registered_users') + 1) dump_sql_postgres() #=> UPDATE "store" SET "registered_users" = ("store"."registered_users" + 1) # WHERE UPPER("store"."name"::text) LIKE UPPER('st%') dump_store()