SlideShare a Scribd company logo
1 of 19
Download to read offline
DjangoのORMことはじめ
2018.01.27 読書会スペシャル 於 GEEKLAB.NAGANO
自己紹介
にしざわこういち
twitter: @koty
GEEKLAB.NAGANO 管理人見習い
SIer(Javaとか.NETとか)→現職(Python/Django/AWS/Vue.js)
Django概要
● Pythonで作られたフルスタック・フレームワーク
● ORM - Object Relational Mapping オブジェクト関係マッピング が優れている。
● 管理サイトが素晴らしい。
● 学習コストが低い
 引用元:Python Django入門 (1) - Qiita
これに加え「DB Migrationが便利」                     参考:普段Django
を使っている人間がruby on railsを勉強してみた話 - slideshare
DjangoのORMことはじめ
SQLアンチパターン 読書会スペシャルということで、
DjangoのORM周辺の話をします
目次
● Model
● Query
○ select
○ insert
○ update
○ delete
○ 外部キー先のデータの取得
● DB Migration
Model
from django.db import models
class Tag(models.Model):
url = models.CharField(max_length=100)
class User(models.Model):
username = models.CharField(max_length=100)
class Profile(models.Model):
tags = models.ManyToManyField(Tag, related_name='profiles')
user = models.ForeignKey(User, unique=True, related_name='profile')
多対多
1対1
primary_key=True
を指定しない場合は、
idという列ができる
select
単純な全件select
users = User.objects.all().order_by(‘username’)
# select id, username from user order by username;
単純な条件
users2 = User.objects.filter(username='koty')
# select id, username from user where username='koty';
select
ユニークキーでの取得
try:
koty = User.objects.get(id=1)
except User.DoesNotExist:
pass
except User.MultipleObjectsReturned:
pass
0件のときは例外が発生
2件以上のときも例外が発生
select
あいまい検索
users3 = User.objects.filter(username__startswith='koty')
# select id, username from user where username like 'koty%';
users4 = User.objects.filter(username__endswith='koty')
# select id, username from user where username like '%koty';
users5 = User.objects.filter(username__contains='koty')
# select id, username from user where username like '%koty%';
select
group by
from django.db.models import Count
Tag.objects.values('url') 
.annotate(url_count=Count('url')) 
.filter(url_count__gt=1)
# select url count(username) as url_count from tag group by url having
count(url)>1
insert
koty2 = User.objects.create(username='koty2')
# insert into user ('username') values ('koty2')
koty2 = User(username='koty2')
koty2.save()
# insert into user ('username') values ('koty2')
update と delete
koty2.username = 'koty3'
koty2.save()
# update user set username='koty3' where id=2
koty2.delete()
# delete from user where id=2;
外部キー先のデータの取得
p = Profile.objects.get(id=1)
u = p.user
profiles = Profile.objects.all()
for p in profiles:
print(p.user)
profiles = Profile.objects.select_related('user').all()
# select profile.id, profile.user_id, user.id, user.username
from user inner join user on profile.user_id=user.id
参照された時点で select が走る
N+1 問題
select_relatedでフィールドを指定すると
JOINになる
外部キー先のデータの取得
逆方向の参照
profiles = user.profile.all()
profile = profiles[0]
user = models.OneToOneField(User, related_name='profile')
profile = user.profile OneToOneフィールドで定義すれば単一オブジェクトを取得で
きる
外部キー先のデータの取得
逆方向参照でのN+1問題への対応
users = User.objects.prefetch_related('profile').all()
# select id, user_id from profile where id user_id in (1, 2);
prefetch_relatedで事前に取得しておける
ナマSQL
Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM myapp_person')
ナマSQLも書けるが、得体の知れない負けた感
https://docs.djangoproject.com/en/2.0/topics/db/sql/
ログ出力
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG',
},
},
}
どんなSQLが発行されるか、普段の開発から注意を
払っておく
DB Migration
modelにフィールドを追加
class User(models.Model):
username = models.CharField(max_length=100)
birthday = models.DateField(null=True)
> ./manage.py makemigrations
> ./manage.py migrate
migrationファイルが生成される
migration適用。alter table が走る
←フィールドを追加
おしまい
Djangoはいいぞ

More Related Content

What's hot

渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
Yoshitaka Kawashima
 
RubyKaigi2011の雰囲気
RubyKaigi2011の雰囲気RubyKaigi2011の雰囲気
RubyKaigi2011の雰囲気
Sea Mountain
 
2013 08-19 jjug
2013 08-19 jjug2013 08-19 jjug
2013 08-19 jjug
sk44_
 
GopherJS + Nashorn
GopherJS + NashornGopherJS + Nashorn
GopherJS + Nashorn
Takuya Ueda
 

What's hot (20)

渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
 
エンジニアが Webを学ぶために やっててよかったこと
エンジニアが Webを学ぶために やっててよかったことエンジニアが Webを学ぶために やっててよかったこと
エンジニアが Webを学ぶために やっててよかったこと
 
RubyKaigi2011の雰囲気
RubyKaigi2011の雰囲気RubyKaigi2011の雰囲気
RubyKaigi2011の雰囲気
 
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
 
「プログラミングGroovy」入門(公開用)
「プログラミングGroovy」入門(公開用)「プログラミングGroovy」入門(公開用)
「プログラミングGroovy」入門(公開用)
 
コードに潜むC++の未定義動作達
コードに潜むC++の未定義動作達コードに潜むC++の未定義動作達
コードに潜むC++の未定義動作達
 
2013 08-19 jjug
2013 08-19 jjug2013 08-19 jjug
2013 08-19 jjug
 
Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えて
 
GopherJS + Nashorn
GopherJS + NashornGopherJS + Nashorn
GopherJS + Nashorn
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記
 
非ガチ勢「よし、Coffee script使おう!」
非ガチ勢「よし、Coffee script使おう!」非ガチ勢「よし、Coffee script使おう!」
非ガチ勢「よし、Coffee script使おう!」
 
名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道名古屋Ruby会議02 LT:Ruby中級への道
名古屋Ruby会議02 LT:Ruby中級への道
 
ランダムフォレスト回帰
ランダムフォレスト回帰ランダムフォレスト回帰
ランダムフォレスト回帰
 
Python機械学習プログラミング第10章後半
Python機械学習プログラミング第10章後半Python機械学習プログラミング第10章後半
Python機械学習プログラミング第10章後半
 
で、次は何がくるの? - 第2回 TIS Matsuri
で、次は何がくるの? - 第2回 TIS Matsuriで、次は何がくるの? - 第2回 TIS Matsuri
で、次は何がくるの? - 第2回 TIS Matsuri
 
Rubykaigi09 Webでるりまを検索するn個の方法
Rubykaigi09 Webでるりまを検索するn個の方法Rubykaigi09 Webでるりまを検索するn個の方法
Rubykaigi09 Webでるりまを検索するn個の方法
 
continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN Linking
 
Rails5クイックスタート
Rails5クイックスタートRails5クイックスタート
Rails5クイックスタート
 
無名関数のすすめ
無名関数のすすめ無名関数のすすめ
無名関数のすすめ
 

Similar to DjangoのORMことはじめ

今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
 
Gwt+objectifyでラクラクGAEアプリ開発
Gwt+objectifyでラクラクGAEアプリ開発Gwt+objectifyでラクラクGAEアプリ開発
Gwt+objectifyでラクラクGAEアプリ開発
Y OCHI
 
Python札幌 2012/06/17
Python札幌 2012/06/17Python札幌 2012/06/17
Python札幌 2012/06/17
Shinya Okano
 
Python札幌201406
Python札幌201406Python札幌201406
Python札幌201406
Shinya Okano
 

Similar to DjangoのORMことはじめ (20)

Django で始める PyCharm 入門
Django で始める PyCharm 入門Django で始める PyCharm 入門
Django で始める PyCharm 入門
 
Django pgroonga
Django pgroongaDjango pgroonga
Django pgroonga
 
210630 python
210630 python210630 python
210630 python
 
Djangoのススメ
DjangoのススメDjangoのススメ
Djangoのススメ
 
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けようDjango ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
 
Parse.comと始めるBackbone.js入門(jscafe7)
Parse.comと始めるBackbone.js入門(jscafe7)Parse.comと始めるBackbone.js入門(jscafe7)
Parse.comと始めるBackbone.js入門(jscafe7)
 
やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013
 
Django learning Part2
Django learning Part2Django learning Part2
Django learning Part2
 
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャGoji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャ
 
Gwt+objectifyでラクラクGAEアプリ開発
Gwt+objectifyでラクラクGAEアプリ開発Gwt+objectifyでラクラクGAEアプリ開発
Gwt+objectifyでラクラクGAEアプリ開発
 
ML system design_pattern
ML system design_patternML system design_pattern
ML system design_pattern
 
Django Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るDjango Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作る
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
 
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
 
Kaggleのテクニック
KaggleのテクニックKaggleのテクニック
Kaggleのテクニック
 
Python札幌 2012/06/17
Python札幌 2012/06/17Python札幌 2012/06/17
Python札幌 2012/06/17
 
PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門
 
Python札幌201406
Python札幌201406Python札幌201406
Python札幌201406
 
TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介
 

More from ko ty

NSEG第25回勉強会
NSEG第25回勉強会NSEG第25回勉強会
NSEG第25回勉強会
ko ty
 
Tddbc nagano0.1(nseg第20回勉強会)
Tddbc nagano0.1(nseg第20回勉強会)Tddbc nagano0.1(nseg第20回勉強会)
Tddbc nagano0.1(nseg第20回勉強会)
ko ty
 
nseg第5回勉強会
nseg第5回勉強会nseg第5回勉強会
nseg第5回勉強会
ko ty
 
第2回nseg slideshare
第2回nseg slideshare第2回nseg slideshare
第2回nseg slideshare
ko ty
 

More from ko ty (14)

Serverless frameworkでお手軽lambda運用 at #nseg #93
Serverless frameworkでお手軽lambda運用 at #nseg #93Serverless frameworkでお手軽lambda運用 at #nseg #93
Serverless frameworkでお手軽lambda運用 at #nseg #93
 
Serverless frameworkを使ってみた話 at #nseg #90
Serverless frameworkを使ってみた話 at #nseg #90Serverless frameworkを使ってみた話 at #nseg #90
Serverless frameworkを使ってみた話 at #nseg #90
 
AWS Lambda を使ってみた話 at づや会Vol.3
AWS Lambda を使ってみた話 at  づや会Vol.3AWS Lambda を使ってみた話 at  づや会Vol.3
AWS Lambda を使ってみた話 at づや会Vol.3
 
データベース実践入門読書会スペシャル #nseg
データベース実践入門読書会スペシャル #nsegデータベース実践入門読書会スペシャル #nseg
データベース実践入門読書会スペシャル #nseg
 
Open data とは in open data day
Open data とは in open data dayOpen data とは in open data day
Open data とは in open data day
 
Source treeの紹介
Source treeの紹介Source treeの紹介
Source treeの紹介
 
NSEG第33回勉強会
NSEG第33回勉強会NSEG第33回勉強会
NSEG第33回勉強会
 
Nseg第32回勉強会
Nseg第32回勉強会Nseg第32回勉強会
Nseg第32回勉強会
 
NSEG第25回勉強会
NSEG第25回勉強会NSEG第25回勉強会
NSEG第25回勉強会
 
Tddbc nagano0.1(nseg第20回勉強会)
Tddbc nagano0.1(nseg第20回勉強会)Tddbc nagano0.1(nseg第20回勉強会)
Tddbc nagano0.1(nseg第20回勉強会)
 
NSEG第11回勉強会
NSEG第11回勉強会NSEG第11回勉強会
NSEG第11回勉強会
 
nseg第5回勉強会
nseg第5回勉強会nseg第5回勉強会
nseg第5回勉強会
 
NSEG第3回勉強会
NSEG第3回勉強会NSEG第3回勉強会
NSEG第3回勉強会
 
第2回nseg slideshare
第2回nseg slideshare第2回nseg slideshare
第2回nseg slideshare
 

DjangoのORMことはじめ