0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【学習】DBのテーブル構造をPerlのオブジェクトとして扱うために

Posted at

はじめに

前回はMysqlのDBのテーブル構造を修正しました。ですがsqlファイルの修正だけではサーバー側?に反映されないようです。なので反映させる為にどうすればいいのか、まとめていきたいと思います。

👇前回までの内容については下記記事をご覧ください

DB\Schema.pmファイルを編集

このファイルはDBの テーブル構造(ここでは member テーブル)を Perlのオブジェクト として扱うために、どのテーブルにアクセスするのか、どのカラムが存在するのかを指定するためにあります。
もっと短く言うとデータベースのテーブルとコードを結びつけるための設定を行うファイルです。

(ORM(Object-Relational Mapping)を使ってデータベースのテーブル構造を定義するファイル。とも言えます。難しい😥)

(SQLファイルはDBのテーブル定義や初期データを作成するためのものであり、ウェブアプリとDBをつなぐ仕組み(ORMやDBアクセス処理)が別途必要。で、DB\Schema.pmが、「つなぐ仕組み」)

  • ageを誕生日(birthdate)から計算するので、ageカラムは不要
  • その代わりに、birthdateを保存するカラムを保持
  • occupationdrinkのIDも外部キーとして保持
.変更前(一部割愛)
table {
    name 'member';
    pk 'id';
    columns qw(id name age occupation drink remarks);
};

1;
.変更後
table {
    name 'member';
    pk 'id';
    columns qw(id name birthdate occupation_id drink_id remarks created_at updated_at);
    
    # 外部キー制約を設定
    belongs_to 'occupation' => 'questionary1::DB::Occupation', 'occupation_id';
    belongs_to 'drink' => 'questionary1::DB::Drink', 'drink_id';
};

試しにデータを挿入してみる

usernamedatabasenameはご自身が設定したものがはいります。

$ mysql -u <username> -p
mysql> USE <databasename>;
mysql> INSERT INTO member (name, birthdate, occupation_id, drink_id, remarks) VALUES ('山田太郎', '1990-05-15', 1, 1, '特になし');

mysql> SELECT * FROM member;
+----+--------------+------------+---------------+----------+--------------+---------------------+---------------------+
| id | name         | birthdate  | occupation_id | drink_id | remarks      | created_at          | updated_at          |
+----+--------------+------------+---------------+----------+--------------+---------------------+---------------------+
|  1 | 山田太郎     | 1990-05-15 |             1 |        1 | 特になし     | 2025-03-06 17:48:53 | 2025-03-06 17:48:53 |
+----+--------------+------------+---------------+----------+--------------+---------------------+---------------------+
1 row in set (0.00 sec)

ここで改めてウェブフォーム、DB、PerlのSchema.pmとの関係について

こういう事なのかな・・・。

  1. ユーザーがフォームにデータを入力し、送信する
    ユーザーが年齢や名前を入力し、「送信」ボタンを押す。

  2. ウェブサーバーがリクエストを受け取る
    ウェブサーバー(Perlのアプリケーション)は、ユーザーが送信したデータを受け取る

  3. Perlコードがデータを処理し、データベースに保存
    ここで、Schema.pmが関与?フォームから受け取ったデータをSchema.pmの定義に従ってデータベースに挿入し、Schema.pmにより、memberテーブルのカラムが定義され、どのカラムにデータを保存するか、どのような操作をするかを簡単に扱えるようにしている。

  4. データベースに保存されたデータ
    保存されたデータは、後で再利用したり、ユーザーに表示することが可能。

さいごに

Ruby on Railsを学んできていたので、言い換えると下記のような感じなのかな・・・と思いました。今回の内容が何か参考になれば幸いです

👇Ruby on Rails での対応関係

Perl Ruby on Rails
Schema.pm schema.rb (マイグレーションの結果)
SQLの CREATE TABLE db/migrate/xxxx_create_users.rb (マイグレーションファイル)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?