day53 Djangoのマルチテーブルクエリ、およびロックサービス
クロステーブルダブル下線のクエリに基づいて(参加します)
マンツーマン
でも前方の属性テーブルにより、
クエリ旭東のホームアドレス
ret = models.Author.objects.filter(name='旭东').values('ad__addr')
print(ret)
SQL文で表現した場合、それは次のようになります。
select app01_authordetail.addr from app01_author inner join app01_authordetail on app01_author.ad_id = app01_authordetail.id where app01_author.name='旭东';
でも小文字でテーブルのクラス名を逆に
ret = models.AuthorDetail.objects.filter(author__name='旭东').values('addr')
print(ret)
多くの
東京出版社が本を出版しました
場合はSQL文の直接の使用は記述する必要があります。
select app01_book.title from app01_publish inner join app01_book on app01_publish.id = app01_book.publishs_id where app01_publish.name='东京出版社';
ORMの使用は、次のように書かれています:
ret = models.Publish.objects.filter(name='东京出版社').values('book__title')
print(ret)
ret = models.Book.objects.filter(publishs__name='东京出版社').values('title')
print(ret)
多くの多くの
何本についてのお問い合わせは、金龍2を書き込みます
ret = models.Book.objects.filter(authors__name='金龙2').values('title')
print(ret)
ret = models.Author.objects.filter(name='金龙2').values('book__title')
print(ret)
集計クエリ
aggregate聚合查询,结果是普通字典,queryset的结束符
from django.db.models import Avg,Max,Min,Count,Sum
obj = models.Book.objects.all().aggregate(a=Max('price')) #{'price__avg': 200.0}
print(obj)
Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
クエリをグループ化
SQL文で書かれたクエリをグループ化すると、次のようになります。
group by app01_book.publishs_id
たとえば:によって公開された各書籍の最高価格を見つけます
モード1
ret = models.Book.objects.values('publishs_id').annotate(m=Max('price'))
print(ret)
概要:グループ化するための基礎としてのカッコ内のフィールド値に基づいて、意味のフロント注釈に書かれた値は、。注釈あなたがしなければならない統計結果があります。したがって、結果は辞書であるクエリセットタイプのデータを、返されます。
{'publishs_id':1,'m':100}
モード2
ret = models.Publish.objects.annotate(m=Max('book__price')).values('m','name')
print(ret)
要約:注釈を直接意味、オブジェクトの背面に書かれたその前の表に従ったデータのすべてのグループの(デフォルトのid値です)。戻り結果は、すべてのモデルが値によって値次いで(各オブジェクトは、その統計モデルオブジェクトを含む)テーブルの前にオブジェクト、ということです。場合辞書別名、またクエリセットタイプの値フィールドは、統計結果を書き込むと指示することができます。
{'m':100,'name':'东京出版社'}
各著者の名前と本の出版のための最高価格を照会します。
ret = models.Book.objects.values('authors__name','authors__id').annotate(m=Max('price')) # group by authors__name,authors__id
print(ret)
ret = models.Author.objects.annotate(m=Max('book__price')).values('name','m')
print(ret)
クエリF
Fは、この表の二つのフィールドの比較後修飾クエリ結果セットの結果であります
ポイントのようにすべての書籍のコメントの数についての問い合わせの数よりも大きいです。
過去には、我々はまた、ループを使用して見つけることができます:
list1 = []
books = models.Book.objects.all()
for i in books:
if i.dianzan > i.comment:
list1.append(i)
あなたはFクエリを使用している場合、コードはよりシンプルかつ直感的になります。
ret = models.Book.objects.filter(dianzan__gt=F('comment')).values('title')
ret = models.Book.objects.filter(dianzan__lt=F('comment')).values('title')
print(ret)
この4つの事業場
models.Book.objects.all().update(
price=F('price') + 20 # 支持四则运算
)
Qクエリ
実行するクエリQの論理演算、コネクタのQ:
& -- and
| -- or
~ -- not,取反
300未満ポイントの大きなに関するお問い合わせなどの書籍300の価格より
ret = models.Book.objects.filter(Q(dianzan__gt=300)|~Q(price__lt=500),xx='oo').values('title')
ret = models.Book.objects.filter(Q(dianzan__gt=300)).values('title')
ret = models.Book.objects.filter(Q(Q(dianzan__gt=300)|~Q(price__lt=500))&Q(xx='oo')).values('title') # Q查询能够进行各种复杂条件的拼接
print(ret)
ORMは(理解)ネイティブSQL文を実行します
モード1
ret = models.Book.objects.raw('select * from app01_book;')
for i in ret:
print(i.title)
print(ret)
実施例2のDjango自体の接続通路(pymysql構成)
from django.db import connection
import pymysql
conn = pymysq.connect()
cursor = connection.cursor()
cursor.execute('select * from app01_book;')
print(cursor.fetchall())
3 pymysqlの道
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='orm02',
charset='utf8',
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('select * from app01_book;')
print(cursor.fetchall())
外部のスクリプトモデルのDjangoのデータベース操作
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm02.settings")
import django
django.setup()
from app01 import models
ret = models.Book.objects.all().values('title')
print(ret)
ORM業務とロック
ロック
私たちは、コードの足かせを与えることができます:
models.Book.objects.select_for_update().filter(id=1)
業務
グローバルコンフィギュレーションモード1
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mxshop',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': '123',
"ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程当中的sql
}
}
【実施例2プラスビュー機能デコレータ
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()
【実施例3プラス文脈デコレータ
from django.db import transaction
def viewfunc(request):
# This code executes in autocommit mode (Django's default).
do_stuff()
with transaction.atomic(): #保存点
# This code executes inside a transaction.
do_more_stuff()
do_other_stuff()