SlideShare une entreprise Scribd logo
1  sur  52
Takayuki Shimizukawa
Django ORM道場
クエリの基本を押さえ
より良い形を身に付けよう
1
PyCon APAC 2023
● Philippines / Manila 在住
● Pythonプログラマー (2004~ 19年目
● Pythonコミュニティー運営
○ Python mini Hack-a-thon; 2009年~
○ Sphinx users JP; 2010年~
○ PyCon JP Association; accounting director
● (株) BePROUD; IT Architect
● Books 翻訳/執筆 (13冊)
about.me/shimizukawa
2
(CM)『Sphinxをはじめよう 第3版』
3
PythonドキュメンテーションといえばSphinx。
本書はSphinxで執筆し、re:VIew ビルダーで出力し、
組版までワンソースで出版まで行いました。
サイン会もやらせて
ていただきました
m(_ _)m
本日20F O'reillyさんでお安く購入できます!
アジェンダ
● このDjango ORM、どんなSQLを実行しているの?
● 一の形:実行しているSQLをいつも確認する
● 二の形:意図しないタイミングでのSQL発行を避ける
● 三の形:理想のSQLからORMを組む
● 質疑応答
4
デモコード
https://github.com/shimizukawa/pycon-apac-2023-django-orm-dojo
このDJango ORM、
どんなSQLを実行しているの?
5
6
それでは問題です
(実際の現場であったコードの簡易版です)
Q1. どんなSQLを実行してる?
7
レビュー時の
差分はここ
モデル定義
Q1. どんなSQLを実行してる?
8
モデル定義
Q1. どんなSQLを実行してる?
9
index.html
い. SELECT * FROM staff ORDER BY last_login
Q1. どんなSQLを実行してる?
10
い. SELECT * FROM staff ORDER BY last_login
ろ. SELECT pk, name FROM staff ORDER BY last_login
Q1. どんなSQLを実行してる?
11
Q1. どんなSQLを実行してる?
12
い. SELECT * FROM staff ORDER BY last_login
ろ. SELECT pk, name FROM staff ORDER BY last_login
は. 分からん
Q1. どんなSQLを実行してる?
13
い. SELECT * FROM staff ORDER BY last_login
ろ. SELECT pk, name FROM staff ORDER BY last_login
は. 分からん
Q1. どんなSQLを実行してる?
14
は. 分からん。実際に観察してみましょう。
DEMO
注目したのはここ
デモコード
https://github.com/shimizukawa/pycon-apac-2023-django-orm-dojo
Q1. どんなSQLを実行してる?
15
は. 分からん。実際に観察してみましょう。
SQLはQuerySetの使い方によって変わります。
注目したのはここ
「only?大丈夫かな?」と思ったあなたは、...
ORM師範になれるかも💪
「い」「ろ」を選んだあなたは、....
Django ORM道場へようこそ!
みなさんの選択は?
16
Django ORM道場へようこそ
● Django ORMは便利なやつですが、...
○ 時々、とても効率の悪いSQLを実行しているかも
○ 先ほどの例は、N+1と呼ばれるヤツです
● 経験や勘に頼らず、
処理を効率良く行うことができるよう、
道場で、基本の形から見なおしていきましょう。
17
3つの基本形
● 1つ、実行しているSQLをいつも確認しよう
● 1つ、意図しないタイミングでのSQL発行を避けよう
● 1つ、理想のSQLからORMを組もう
18
(CM) BeProud メンバー募集中!
19
Pythonプログラマー、他、ソフトウェア開発やっていくぞ!という
メンバーを通年募集中です!
今すぐBeProud ブースへ!!
自社サービス 書籍執筆 受託開発
一の形:実行しているSQLを
いつも確認しよう
20
実行しているSQLをいつも確認
21
DjangoでSQL実行ログを確
認するには、settings.py に
数行追加しましょう。
(日時もログ出力するにはもうちょ
っと色々設定してください)
では、コンソールログを確
認してみましょう。
ここを追加
実行しているSQLをいつも確認
22
1. 画面アクセスでSQLが表示される
2. migrationでもSQLが表示される
3. N+1の原因コードを修正
DEMO
デモコード
https://github.com/shimizukawa/pycon-apac-2023-django-orm-dojo
実行しているSQLをいつも確認
23
1. 画面アクセスでSQLが表示されました
2. migrationでもSQLが表示されました
3. N+1の原因コード修正が確認できました
補足: only も使い方次第
● DBとの通信を減らすには only が有効
○ 巨大なデータを持つカラムが参照不要と分かっている場合
○ 数万件を取得して、特定カラムだけ参照する場合
● QuerySetの使い方次第では逆効果に...
○ onlyに指定したカラムだけにアクセスする限り、問題なし
○ 指定外のカラムにアクセスすると、都度SQL発行が発動
24
ログは現状を映す鏡
● ログを見よう
○ スポーツ選手が鏡や動画で動きをチェックするように
○ ログ出力は、プログラミングにおける鏡
● SQLを常に観察する習慣を身に付けよう
○ QuerySetに手を加えるとき
○ QuerySetを使った処理を変更するとき
○ レビューに出すとき、SQL出力を添えると👍
○ レビューを受け取ったとき、SQLも確認すると👍
25
ログ以外でSQL確認
26
1. django-debug-toolbar
○ 👍Web画面にデバッグツールバーが
追加され、そこでSQL情報を確認
○ 👎Web画面がないと使えない
■ 最近はDjangoで画面を表示せずAPIサーバーのみの場合も増えており...
2. django-silk
○ 👍SQL実行を専用画面で俯瞰して確認
○ 👎DB保存するので本番利用は避けて!
[CM] 『自走プログラマー』
『自走プログラマー』は120のベストプラクティス
をPythonの先輩から学び、プログラミング中級者を
目指すための書籍です。
Django ORMの話題を含む、コードレビューや技術指導など
で伝えたい事例を多数紹介しています。
Web抜粋版の引用やリンクはご自由にどうぞ!
今すぐ 自走プログラマー で検索!
27
二の形:意図しないタイミング
でのSQL発行を避けよう
28
29
それでは問題 Q2 です
(実際の現場であった事例を元にした創作です)
Q2. 意図しないSQL発行を防止するには?
30
qs = SomeModel.objects.filter(...) の後どうする?
Q2. 意図しないSQL発行を防止するには?
31
qs = SomeModel.objects.filter(...) の後どうする?
QuerySetをテンプレートに渡したらN+1
が発生したのが問題でした
Q2. 意図しないSQL発行を防止するには?
32
qs = SomeModel.objects.filter(...) の後どうする?
QuerySetをテンプレートに渡したらN+1
が発生したのが問題でした
それなら、QuerySetをテンプレートに渡
さなければ問題にならないのでは?
Q2. 意図しないSQL発行を防止するには?
33
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
それなら、QuerySetをテンプレートに渡
さなければ問題にならないのでは?
Q2. 意図しないSQL発行を防止するには?
34
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
ろ. list(qs.values(...))でSQL発行を確定し、辞書化
それなら、QuerySetをテンプレートに渡
さなければ問題にならないのでは?
Q2. 意図しないSQL発行を防止するには?
35
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
ろ. list(qs.values(...))でSQL発行を確定し、辞書化
は. qsをやめてpandas.read_sql()してDataFrame上で処理
それなら、QuerySetをテンプレートに渡
さなければ問題にならないのでは?
Q2. 意図しないSQL発行を防止するには?
36
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
ろ. list(qs.values(...))でSQL発行を確定し、辞書化
は. qsをやめてpandas.read_sql()してDataFrame上で処理
に. 場合による
Q2. 意図しないSQL発行を防止するには?
37
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
ろ. list(qs.values(...))でSQL発行を確定し、辞書化
は. qsをやめてpandas.read_sql()してDataFrame上で処理
に. 場合による
Q2. 意図しないSQL発行を防止するには?
38
に. 場合による。QuerySetの便利さを捨てる場合、デメリットも。
● い. list(qs)でSQL発行を確定し、データクラスに詰め替え
○ 👍クラス定義によってデータの目的が明確になり、扱いやすい
○ 👎詰め替えの実装はけっこう手間がかかる
■ 期待通り詰め替えられているかのUTも書かないといけないよね?
● ろ. list(qs.values(...))でSQL発行を確定し、辞書化
○ 👍取り出した時点で辞書になっているので、データ詰め替えが不要
○ 👎QuerySetを活用するDRF Serializer等とは相性が悪い
● は. qsをやめてpandas.read_sql()してDataFrame上で処理
○ 👍SQL発行が確定するのは間違いなさそう
○ 👎Pandasを持ち出す必要があったのかはよく考えよう
[事例]データクラスに詰め替え
あるプロジェクトでは、
● データクラスに詰め替える実装に変更
○ データ取得、加工、詰め替え、利用でレイヤー増加
■ 実装コード、テストコードの増加(開発時間の増加)
■ コードの見通しが悪化(レイヤーが増えただけ)
■ 付け焼刃の対策が増加(レイヤー間の変数引き回し)
■ データクラスが目的のないバケツ化(dictと変わらない)
● この状態で、ORMクエリの変更をレビューしました(´・ω・`)
39
40
ムダに複雑なコードは問題です
どのような対策が考えられるでしょう?
複雑な問題は複雑なまま解かない
● 課題: コードが複雑で変更が適切か分からない
○ 対策: コードをシンプルにしてから考える
● 課題: 複数レイヤーに分散して見通しが悪い
○ 対策: 考えるために、一旦コードを1ファイルへ集約
● 課題: データ詰め替えが手間
○ 対策: 省略できる処理をばっさり削除(開発ルールやフレームワークの都合は一旦無視)
● 課題: データクラスがバケツ化
○ 対策: データクラス廃止を検討
● 課題: 付け焼き刃の対策コードが多い
○ 対策: シンプルなコードで対策を考える
41
Q1のコードを例に説明
views.py
index.html
42
try1.py
Q1のコードを1ファイルに集約
43
1ファイルに集約して試行錯誤
44
DEMO
1.try1.py にコードを集約
2.python try1.py
3. ログを確認しながら試行錯誤
デモコード
https://github.com/shimizukawa/pycon-apac-2023-django-orm-dojo
ここを変更
try1.py
1ファイル上で試行錯誤した結果
45
試行錯誤のループ
● while 欲しいORMクエリが書けたか:
○ コード上に分散したORMクエリを修正
○ QuerySetの利用箇所を修正
○ その処理を呼び出すWeb画面を操作
○ DjDTやSlikを確認するため、画面を操作
コードが分散しているし、画面操作が多くて面倒....
1ファイルに集約して、コマンド実行でサクサク確認しよう
46
datamodels.py
views.py
serializers.py
index.html
試行錯誤の高速化
● while 欲しいORMクエリが書けたか:
○ 1つの .py ファイルを修正
○ .py ファイルを実行して、ログを確認
1ファイルに集約するメリット
● コードが1箇所で把握しやすい
● 画面操作が不要
● 適切なモジュールへの配置や整形に気にせず書ける
47
try1.py
try1.py
意図しないSQL発行を防止するには
48
1. コードの全体像を把握して、
2. ORMクエリの準備、データ加工、利用の処理から、
3. 必要十分なSQLが発行されるように全体を調整し、
4. 最も効率の良いコードにまとめる
この作業を、シンプルなコードで高速に回しましょう
models.py
datamodels.py
serializers.py
views.py
index.html
try1.py
models.py serializers.py
views.py index.html
三の形:理想のSQLから
ORMを組もう
49
三の形:理想のSQLから
ORMを組もう
50
続きは 書籍で!
ありがとうございました
Questions?
51
https://about.me/shimizukawa
Welcome to
Sprint after-party of
Register now!! →
Let’s have fun
at the end of
2023-10-29T18:30:00+09:00
Venue: Shibuya
Fee: >6,000 JPY
(discount for students)
(CM) 10/29(Sun) 18:30~ 非公式Party

Contenu connexe

Tendances

Tendances (20)

それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
情報共有から始めるチーム開発とキャリア戦略
情報共有から始めるチーム開発とキャリア戦略情報共有から始めるチーム開発とキャリア戦略
情報共有から始めるチーム開発とキャリア戦略
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
RFC 〜 ネットワーク勉強会
RFC 〜 ネットワーク勉強会RFC 〜 ネットワーク勉強会
RFC 〜 ネットワーク勉強会
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集RedmineのFAQとアンチパターン集
RedmineのFAQとアンチパターン集
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
Easybuggy(バグ)の召し上がり方
Easybuggy(バグ)の召し上がり方Easybuggy(バグ)の召し上がり方
Easybuggy(バグ)の召し上がり方
 
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
 
老害について
老害について老害について
老害について
 
LayerXのQAチームで目指したい動き方 (社内資料)
LayerXのQAチームで目指したい動き方 (社内資料)LayerXのQAチームで目指したい動き方 (社内資料)
LayerXのQAチームで目指したい動き方 (社内資料)
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
アジャイル・スクラム時代のパタン・ランゲージとアレグザンダー理論
アジャイル・スクラム時代のパタン・ランゲージとアレグザンダー理論アジャイル・スクラム時代のパタン・ランゲージとアレグザンダー理論
アジャイル・スクラム時代のパタン・ランゲージとアレグザンダー理論
 
Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~
 

Similaire à Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう

Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
Kenji NAKAGAKI
 
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
Akihiro Kuwano
 
Pythonで検索エンジン2
Pythonで検索エンジン2Pythonで検索エンジン2
Pythonで検索エンジン2
Yasukazu Kawasaki
 
20101127 Android Usability Seminar
20101127 Android Usability Seminar20101127 Android Usability Seminar
20101127 Android Usability Seminar
Visso株式会社
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ
Kentarou Mukunasi
 
Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋
Yuto M
 

Similaire à Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう (20)

Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
ユーザ・デザイナーから見たPlone CMSのアピールポイント
ユーザ・デザイナーから見たPlone CMSのアピールポイントユーザ・デザイナーから見たPlone CMSのアピールポイント
ユーザ・デザイナーから見たPlone CMSのアピールポイント
 
Django で始める PyCharm 入門
Django で始める PyCharm 入門Django で始める PyCharm 入門
Django で始める PyCharm 入門
 
210630 python
210630 python210630 python
210630 python
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて
 
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
 
いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...
いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...
いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...
 
Logcatの話
Logcatの話Logcatの話
Logcatの話
 
Pythonで検索エンジン2
Pythonで検索エンジン2Pythonで検索エンジン2
Pythonで検索エンジン2
 
20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?
 
20101127 Android Usability Seminar
20101127 Android Usability Seminar20101127 Android Usability Seminar
20101127 Android Usability Seminar
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ
 
Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...
Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...
Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...
 
APIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjpAPIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjp
 
SnapDishの事例
SnapDishの事例SnapDishの事例
SnapDishの事例
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
 
Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋
 
Python & PyConJP 2014 Report
Python & PyConJP 2014 ReportPython & PyConJP 2014 Report
Python & PyConJP 2014 Report
 
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
 

Plus de Takayuki Shimizukawa

Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Takayuki Shimizukawa
 

Plus de Takayuki Shimizukawa (20)

Navigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential ReadsNavigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential Reads
 
IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023
 
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由
 
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころ
 
独学プログラマーのその後
独学プログラマーのその後独学プログラマーのその後
独学プログラマーのその後
 
Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018
 
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
 
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
 
素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集い素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集い
 
世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015
 
JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
 
Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015
 
Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015
 
Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015
 
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
 
Easy contributable internationalization process with Sphinx @ pyconsg2015
Easy contributable internationalization process with Sphinx @ pyconsg2015Easy contributable internationalization process with Sphinx @ pyconsg2015
Easy contributable internationalization process with Sphinx @ pyconsg2015
 

Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう

Notes de l'éditeur

  1. I have been using Python since 2004 My main activities are as follows: Organizing Python communities in Japan: "Python mini Hack-a-thon", "Sphinx users JP" and "PyCon JP Association" non-profit organization. Working as an IT architect at BePROUD Inc in Japan. I also translate and write Python related books. For more information, please visit https://about.me/shimizukawa
  2. ある日レビュー依頼がきました。 差分は問題なさそうですが、ふと、差分とは関係ない別のことが気になりました。
  3. 差分のひとつにクエリのorder_by条件の変更があり、それ自体は問題無さそうです。 ここで私が気になったのは、このクエリがどういうSQLを実行しているか、です。 このクエリ、どんなSQLを実行していると思いますか?
  4. ちなみに、モデル定義はこんな感じ
  5. ちなみに、テンプレートはこんな感じです。
  6. 注目したのは、onlyの部分です。
  7. DB保存すると、トランザクションが競合してロールバックしちゃったり、DB容量を圧迫したり、パフォーマンスに影響を与えたりします。
  8. 弊社ビープラウドブースにて、見本を読めますので、ブースにもお立ち寄りください~
  9. 先ほどの例ではORMクエリをテンプレートに渡したことで、N+1が発生したので、代わりにデータクラスに詰め替える実装にしました。しかし今度はソースコードが複雑になって開発しづらくなってしまいました。 ビューの処理内にSQL発行を閉じ込めることで意図しないタイミングでのSQL発行を避ける方針は良いですが、実装の手間が増えてしまうのも考え物です。
  10. Djangoテンプレートのforループ処理やフィルター処理などに利用箇所が分散していることがあります。 また、クラスベースビューではベースとなるquerysetの用意とそこにクエリ条件を追加する処理が分かれていたり、Django REST Frameworkではさらにシリアライザの都合に合わせてselect_relatedやprefetch_relatedの用意が必要になったりします。
  11. Expert Python Programming, Fourth Edition's Target Audience are: Python developers who want to master Python in depth Python developers who use Python in their work Overview: This book covers the tools, techniques, and best practices that advanced Python programmers use in their work. Readers will learn advanced Python concepts and skills to create more efficient and high-quality Python code.
  12. Translation and writing works Since the first book in 2010, I have continued to translate and write as a side job while working on Python web applications. This year, my 13th book was published. Today I would like to share with you four books that mark milestones in my experience as a author and a translator. They are entitled, "Python books as milestones"