djangoをdockerコンテナで利用(15) - djangoでsql直接発行
djangoでレコードの集計してたら、どうしてもできない集計があることに気づいた。 仕方がないので、直接sql発行して集計させることにした。 sqlを文字列として準備し発行すると、仮にexceptionが発生したときにもそれをエラーログとして出力させるようにした。 ログ出力 はmariadbに出力するようにしてる。 今回はレコード集計結果を作ったのでそのメモ。 結論 djangoで経費のレコードを処理する画面を作ってる途中。 これから「編集」と「操作」の列にボタン足して編集・コピー・削除の機能をつけてこうとしてる。 他の画面で既に「編集」と「操作」は作ってあるから、djangoのviewsにはコピーして作れば余裕。 経費テーブルには、かかった費用の目安を記録しときたいから、自作の科目も含んでて、実際の「水道代」とか「外食費」もつけて台帳管理してる。 自宅で業務をしてると「水道光熱費」ってのは、実生活でかかる水道代や電気代を業務と生活で按分しなきゃいけないから、全部を計上しちゃいけない。 確定申告で使う経費科目は決まっているから、自作の経費科目は経費計上しないようにしたい。 けれど、djangoではその科目に応じた集計をさせられない場面があった。 予想してたけど、やっぱりできん集計あるんやなぁ。 (自分がまだ見つけられてないだけかもしれん) さっさと進めて作りたかったから、直接SQLの文字列を発行して集計結果を表示させるようにした。 djangoの基本機能で集計できなかったのは、経費合計。 理由は経費テーブルから外部参照する科目テーブルに、経費対象の列があって、外部参照する列をdjangoのfilterで指定できなかったから。 指定するとエラーになって、実テーブルに存在する項目しか指定を許可してくれなかったから。 その他の、医療費控除とか売上合計なんかの科目狙い打ち集計はできてた。 自分のテーブル設計がマズいのかもしれんけど、既存のphp版からの移行作成やから、保管構造は変えない方針。 (idの列は足したけど・・・) 処理優先で考えるんじゃなく、データベース優先で考えるから、djangoの機能を使えるところだけ使って、実際の集計はsql書くことにした。 既存のphp版にある過去7年分、84か月分の経費合計がきっちりあってた。1円も狂ってなくて気持ちよかったなぁ。 djangoは「SQL書かなくても動く」ってのがいいところ、みたいな書き方を見かけるけど、DBMSの集計機能を使ってSQLで書いたほうがいいこともあると思う。 実際の開発でSQL書けない人がたまにいるけど、RDBを扱うときにSQL書けなかったら、本番開始後のDB関連障害や高速化に対応できないんじゃないかとも思う。 例えばoracleからpostgresqlに移行するときのことを考えて、sqlは一切書かずに全部djangoに任せるっていうのはいいことかもしれんけど、そういう見込みがないんやったらベタのSQL書いて楽したほうがええんとちゃうか? サンプルデータ 例えばこんなデータがあったとする。 月間の売上とか経費が入ってる。 経費テーブル workPeriodは、経費計上の年月だけ使ってるから、全部1日の0:00:00って入ってる。 Kamokuは、科目テーブルにある科目番号と科目名が埋め込んである。 id workPeriod workShubetsu workPriority Keihi_date Kamoku Tehai Kng Biko 9058 2022/03/01/火 0:00:00 1yan 1001 2022/03/10/木 0:00:00 008-給料賃金 給与 60000 20140924申請の青色事業者専従者給与に関する届出書により10万円を目標に計上。 9059 2022/03/01/火 0:00:00 1yan 1002 2022/03/10/木 0:00:00 020-水道光熱費 光熱費 10000 50%を事業用の電気代とする。月平均2万円x50%=1万円。 9068 2022/03/01/火 0:00:00 1yan 1003 2022/03/10/木 0:00:00 025-通信費 インターネット/電話利用料 10000 電話とインターネットは50%を事業用の電気代とする。月平均2万円x50%=1万円。 9060 2022/03/01/火 0:00:00 2kgc 1010 2022/03/31/木 0:00:00 101-現金売上 amazon販売 0 物販(3/xx) 9077 2022/03/01/火 0:00:00 2kgc 1020 2022/03/10/木 0:00:00 102-預金売上 お客様 100000 xxx案件 9074 2022/03/01/火 0:00:00 2kgc 1047 2022/03/31/木 0:00:00 023-損害保険料 xx保険 6550 エージェント会社提供の掛け捨て保険 9087 2022/03/01/火 0:00:00 2kgc 1068 2022/03/05/土 0:00:00 003-研究開発費 定食屋 1630 IT市場調査。昼食。 9070 2022/03/01/火 0:00:00 2kgc 1072 2022/03/06/日 0:00:00 001-打合会議費 喫茶xx 2480 月初打合せ 9101 2022/03/01/火 0:00:00 2kgc 2019 2022/03/20/日 0:00:00 003-研究開発費 apple 4787 mp4解析用 9055 2022/03/01/火 0:00:00 3ikk 1042 2022/03/31/木 0:00:00 038-外食費 外食費累積 1467 目安 9056 2022/03/01/火 0:00:00 3ikk 1043 2022/03/31/木 0:00:00 039-食費 食費累積 74120 目安 9051 2022/03/01/火 0:00:00 3ikk 1045 2022/03/31/木 0:00:00 099-預金残高 銀行残高 0 残高確定 9085 2022/03/01/火 0:00:00 3ikk 1046 2022/03/31/木 0:00:00 040-水道代 大阪市水道局 3842 1月分水道代。1月13日検針。22立米。(クレカ引き落とし) 9054 2022/03/01/火 0:00:00 3ikk 1053 2022/03/31/木 0:00:00 041-電気代 関西電力 19738 3月分電気代。919kwh。 経費種別テーブル workShubetsuは経費の種別で、djangoのtemplatesで表示させるときの色指定が一緒に入ってる。 ...