スイカ大好き

インフラ⇒Web⇒バックエンド ふら~ふら~とモラトリアムし続けてる文系エンジニアの、日々の技術メモ

CREATE文⇔Excel ツール作ろうかと思ったけどcopilotで充分だった

ぐちぐちと経緯

これまでに発生したトラブルを踏まえた、再発防止のためのチェックリストがある。内容は具体的で、工程ごとにそのチェックリストにチェックをしてから次の工程に進むことになっている。まあ実際には他部署が絡むイベントのタイミングで全部埋めるみたいな感じっぽい。これが本当に微に入り細に入り、レベル高くて難しくてベテランしか意味の理解すら難しいやろ、こんなんやってたら納期倍以上かかりまっせ、て感じ。でもこれを踏まえて工程進めていったら確かに手戻り減らせるなと、学びがあるチェックリストだなと、ありがたく思っている。

ちょっと向き合い過ぎて今の工程が進んでおらず、上長からそっちはもうおいておきなさいとの指令が出たが、こっそり、踏まえながら、やっている。後からチェックして「これ満たしてない」ってなったら戻ってやり直しになるんだから、今これを置き去りにして工程進めるのが無駄だとも思ったし。

創りたいツール Excel⇒CREATE文、CREATE文⇒Excel

そのチェックリストのなかで、「設計書とDDLが一致してること」というのがあった。それをするのに、DDLをExcelに貼って、そこからテーブル名、項目名、データ型、桁数、NULLの許容をそれぞれ関数で抜き出して、設計書と「=A2=B2」でひとつひとつ確認して、、

ちょっとした手間だった。チェックリストの1項目のために20-30分ほど費やした。しかしこれで齟齬をひとつ見つけて、このチェックリスト本当だいじ、チェックじゃなく手順にしたほうがいいやろ、と思った。

ツール化できそうだから作ろうと思ったけど、マクロをcopilotに書かせても、思い通りのものってなかなか一発ではできなくて、ちまちま直してそれなりに時間かかっちゃう。でそもそもcopilotにやらせてみようと思った。(業務情報でもルール守れてれば使用してよいことになっている)
今業務のデータでなく適当なDDLでやってみたんだけど、できるね当たり前だけど。ツールじゃなくて、プロンプトだけコピペできるように残しておけば良さそう。

(DDL)CREATE文⇒Excel

プロンプト

以下のDDLを、項目を縦に書き連ねた表形式にしてください。 項目の右隣にデータ型、その右隣りの列に桁数、その右隣りの列にNULLの許容も表に入れてください。 項目の左の列にプライマリーキーの列を設け、実際にプライマリーキーである項目の左に〇をつけてください。表はExcelに貼れるよう、tab区切り形式にしてください。

(DDLをコピペする)

ブログはhtmlの世界なのでhtmlのtableにしてもらいました。上記のプロンプトで、こんな形でDDLを表にしてくれます。

プライマリーキー 項目 データ型 桁数 NULLの許容
emp_no int 11 NOT NULL
  birth_date date - NOT NULL
  first_name varchar 14 NOT NULL
  last_name varchar 16 NOT NULL
  gender enum('M','F') - NOT NULL
  hire_date date - NOT NULL

参考までに

Excelに貼る時のことも、知らない方のために書いておきたいが、ブログは自宅PCで書いてるのでExcelが入ってない。。選択肢など正確にお伝えができない。別途copilotに聞くなりしてください。

Excel⇒CREATE文

プロンプト

以下の表を、CREATE文にしてください
(Excelの表を貼る)

表にテーブル名が含まれてないので、テーブル名のところは書き換える必要がありますが。

CREATE TABLE `your_table_name` (
  `emp_no` int(11) NOT NULL,
  `birth_date` date NOT NULL,
  `first_name` varchar(14) NOT NULL,
  `last_name` varchar(16) NOT NULL,
  `gender` enum('M','F') NOT NULL,
  `hire_date` date NOT NULL,
  PRIMARY KEY (`emp_no`)
);

こんな感じで回答いただきました。あとはDDLならWinMergeで表から作成後のやつと一致を確認するとか、元となった表と、DDLから作成した表を比較するのでも良いと思うし。

今日私がやったみたいな、DDLからカッコの位置をfindで見つけて、mid関数で、、ていうのを列ごとにやるよりかは遥かに効率的だと思いました。

完全に閉鎖された環境でこのような開発しててチェックが必要なら、ツールはあるといいけど、今回はツール作るのやめます。プロンプトだけ若干考えるの面倒だったからメモ残して使いまわすかも。使いまわせる内容だし。

enum('x','y')

今回の例のDDLは例をインターネットからパクッて私が改変しました。だから知らないのがありました。enum('M','F') のところです。これついでに豆知識として、copilotに聞いた結果貼り付けておきますね。

enum('M','F') は、列が許容する値の範囲を制限するためのデータ型です。enum は列挙型(enumeration)を意味し、この場合、列 gender には 'M' または 'F' のみが許可されることを示しています。

つまり、gender 列には 'M'(男性)か 'F'(女性)しか入力できません。これはデータの整合性を保つために使われるもので、指定された値以外のデータが入力されるのを防ぎます。

確認「データ型はenumではなく、enum('x','y')でデータ型、ということですか」

その通りです。enum('M','F') 全体がデータ型になります。enum は列挙型を示しており、具体的に許可される値のリストを指定するものです。この場合、'M'(男性)と'F'(女性)だけが許可されるという意味になります。

つまり、enum('M','F') はデータ型として機能し、その列には 'M''F' のいずれかしか入力できないように制限しています。これにより、データの一貫性と正確性が保たれます。