Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Django QuerySet "ARE" Patterns

Django QuerySet "ARE" Patterns

DjangoCongress JP 2019 Lightning Talk

HayaoSuzuki

May 18, 2019
Tweet

More Decks by HayaoSuzuki

Other Decks in Technology

Transcript

  1. 明日から使うな!
    Django QuerySet
    アレパターン
    Hayao Suzuki
    @CardinalXaro

    View full-size slide

  2. おまえ誰よ
    ● Hayao Suzuki @CardinalXaro
    ● 株式会社アイリッジ
    ○ Pythonエンジニア
    ○ テックリード(自称)
    ● オライリージャパンの回し者
    ○ テクニカルレビュワー(自称)

    View full-size slide

  3. 今日のテーマ
    ● Django QuerySetでやらかした思い出を語る。
    ● 本日、スマートフォンで作ったスライドなので手抜きです。
    ● この発表はフィクションであり、営業さんが客先で軟禁されたとか
    エンジニアが土日待機したなどの事実はありません。

    View full-size slide

  4. indexを張らずにDBがスパイクした
    ● token = models.TextField(max_length=200)
    ● token = models.CharField(max_length=200, db_index=True)

    View full-size slide

  5. 年月日で調べたい
    'regist_dt__year': today.year,
    'regist_dt__month': today.month,
    'regist_dt__day': today.day

    View full-size slide

  6. なんだこれは、たまげたなあ
    WHERE (EXTRACT(DAY FROM `regist_dt`) = 28 AND EXTRACT(MONTH FROM
    `regist_dt`) = 1 AND `regist_dt`
    BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 23:59:59.999999'

    View full-size slide

  7. こうした
    'regist_dt__gte': datetime.datetime.combine(datetime.date.today(),
    datetime.time.min),
    'regist_dt__lte': datetime.datetime.combine(datetime.date.today(),
    datetime.time.max),

    View full-size slide

  8. そうそうこれだよ
    WHERE (`regist_dt` >= 2019-01-28 00:00:00 AND `regist_dt` <= 2019-01-28
    23:59:59.999999

    View full-size slide

  9. 結論
    ● 実行計画調べよう
    ● SQL見よう
    ● LT資料は事前に準備しよう

    View full-size slide