djangoをdockerコンテナで利用(14) - djangoでblobカラムを含むレコードのコピー
djangoでblob列を含むレコードを作成・更新・参照・削除することができるようになった。 自分特有の blob操作 もできるようになった。 ただ、これだけでは自分にとって使える処理とは言えない。 普段は一度入力した内容をコピーして再作成することのほうが多い。 1から入力するんじゃなく、既存レコードをコピーして更新しながら作る。 そのほうが楽やし。 今回はレコードをコピーする処理を作ったのでそのメモ。 結論 実際の作りはこうなった。 月間作業予定の一覧を年月単位で存在させてて、優先順位を番号として付けてある。 listviewを使って一覧表示させたレコードに「行コピー」ってボタンを作って、そのレコードをコピーし、ボタンを押すとそれ以降のレコードの優先順位を+1する。 例えばこういうレコードがあって3列目にあるコピーボタンを押すと、 こうなる。 4列目に優先順位「27」ってあるレコードがコピーされて「28」ができてる。 ここで「27」からさらにコピーすると、「27」と「28」は「28」と「29」になって、元の27を新規レコードとして保管する。 右端の3列にガッキーのjpeg、五線譜のpdfの1ページ目をjpeg変換したもの、ガッキーの別のjpegがちゃんと入ってコピーされている。 しっかしガッキーかわいい。 格納したファイルと性能 jpegは100KB程度やけど、pdfはムーンライトソナタの譜面で16ページ、7.5MB程度ある。 それをbase64でエンコードして保管するから、容量は1.5倍程度として1レコードはたぶん10MB強。 それでもdjango的には1秒もかからず処理してくれている。 20件ある先頭レコードでコピーしても同じやった。 数百件とか数千件だと時間かかるのかもしれないけど、ここではこれで十分。 dockerコンテナでもこれぐらい動いてくれるんやなぁ。 レコードの構成 jpegとpdfは実表示用データ(longblob)だけでなく、一覧表示するときのための縮小版(mediumblob)を持ってる。1レコードに3つの添付ができるように、同じようなフィールドが3つずつある。 mariaDB上の定義 前回のblob操作は在庫のテーブル使ってたけど、今回は活動テーブル。 BLOBって名前で始まる列の定義は他のテーブルも完全に同じ。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 CREATE TABLE `GVIS_work` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `workPeriod` datetime DEFAULT NULL COMMENT '業務期間-開始日', `workShubetsu` char(4) DEFAULT NULL COMMENT '作業種別', `workPriority` int(10) DEFAULT NULL COMMENT '優先順位', `Category1` varchar(100) DEFAULT NULL COMMENT 'カテゴリ1', `Category2` varchar(100) DEFAULT NULL COMMENT 'カテゴリ2', `Tehai` varchar(10000) DEFAULT NULL COMMENT '手配方法・名称・機種', `Kazu` decimal(12,4) DEFAULT 0.0000 COMMENT '数量', `Tnk` decimal(12,4) DEFAULT 0.0000 COMMENT '単価', `Kng` decimal(12,4) DEFAULT 0.0000 COMMENT '金額', `WorkTime` decimal(12,4) DEFAULT NULL COMMENT '作業時間', `Biko` varchar(100) DEFAULT NULL COMMENT '備考', `BLOB_data1` longblob DEFAULT NULL COMMENT 'BLOBデータ1', `BLOB_data2` longblob DEFAULT NULL COMMENT 'BLOBデータ2', `BLOB_data3` longblob DEFAULT NULL COMMENT 'BLOBデータ3', `BLOB_extent1` varchar(100) DEFAULT NULL COMMENT '添付mime1', `BLOB_extent2` varchar(100) DEFAULT NULL COMMENT '添付mime2', `BLOB_extent3` varchar(100) DEFAULT NULL COMMENT '添付mime3', `BLOB_medium1` mediumblob DEFAULT NULL COMMENT '添付-埋め込み画像用1', `BLOB_medium2` mediumblob DEFAULT NULL COMMENT '添付-埋め込み画像用2', `BLOB_medium3` mediumblob DEFAULT NULL COMMENT '添付-埋め込み画像用3', `ins_date` datetime DEFAULT NULL COMMENT 'データ作成日', `ins_user` varchar(100) DEFAULT NULL COMMENT 'データ作成ユーザ', `upd_date` datetime DEFAULT NULL COMMENT 'データ更新日', `upd_user` varchar(100) DEFAULT NULL COMMENT 'データ更新ユーザ', PRIMARY KEY (`id`), KEY `IDX_work` (`workPeriod`,`workShubetsu`,`workPriority`,`Category1`,`Category2`,`Tehai`(255)) ) ENGINE=InnoDB AUTO_INCREMENT=1502 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC django内のmodels.pyの定義 blob列はdjangoではTextFieldになる。 ...