====== Apricot データベース ====== --- //[[http://www.y2sunlight.com|y2sunlight]] 2020-07-29// [[apricot:usage:ja|Apricot ドキュメント に戻る]] 目次 * [[apricot:usage:ja:features|Apricot 特徴と概要]] * [[apricot:usage:ja:config|Apricot 配置と構成]] * [[apricot:usage:ja:errors-logging|Apricot ログとエラー処理]] * [[apricot:usage:ja:http|Apricot リクエストとレスポンス]] * [[apricot:usage:ja:frontend|Apricot フロントエンド]] * Apricot データベース * [[apricot:usage:ja:model|Apricot モデルとサービス]] * [[apricot:usage:ja:middleware|Apricot ミドルウェア]] * [[apricot:usage:ja:controller|Apricot コントローラ]] * [[apricot:usage:ja:validation|Apricot バリデーション]] * [[apricot:usage:ja:provider|Apricot サービスプロバイダー]] * [[apricot:usage:ja:authentication|Apricot ユーザ認証]] * [[apricot:usage:ja:utility|Apricot ユーティリティ]] ---- ===== ORMの利用 ===== Apricotでは、ORマッパーに[[basic-library:idiorm:1.5|Idiorm]]を使用します。詳しい使い方やメソッドについてはIdiormの[[https://idiorm.readthedocs.io/en/latest/|マニュアル]]を参照して下さい。 Idiorm の典型的な使用例を示します: $user = ORM::for_table('user')->find_many(); これは、userテーブルから全件を検索する例です。このように、IdiormではORMクラスの静的メソッドの呼び出しを使ってコーディングします。これはApricotのシングルトンと同じ方法で、実際にORMクラスもシングルトンです。 \\ ===== Idiormの設定ファイル ===== 以下はApricotが提供している初期のIdiormの設定ファイル( ''idiorm.setting.php'' )です。 {{fa>folder-open-o}} ** /your-project/config/setting ** 'sqlite', 'caching' => true, 'logging' => true, 'connections' => [ 'sqlite' => [ 'connection_string' => 'sqlite:'.var_dir('db/apricot.sqlite'), 'db_file' => var_dir('db/apricot.sqlite'), ], 'mysql' => [ 'connection_string' => 'mysql:host=localhost;port=3306;dbname=apricotdb', 'username' => 'apricot', 'password' => 'password', 'driver_options' => [PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8'], 'check_tables' => 'show tables like \'user\'', 'initial_statements'=> [ 'set names utf8', ], ], ], 'initial_data' => [ 'user'=> [ 'exec:sqlite' =>[ 'delete from sqlite_sequence where name=\'user\'', ], 'exec:mysql' =>[ 'alter table user auto_increment = 1;', ], 'rows' => [ [ 'account' =>'root', 'password' =>password_hash('', PASSWORD_DEFAULT), 'email' =>'root@sample.com', 'note' =>'Initial User', 'created_at' => $now, 'updated_at' => $now, ], ], ], ], ]; * database--- データベース名 (初期設定値は sqlite ) * caching --- キャッシングの有無 * logging --- ロギングの有無 * connections --- データベース毎の接続を設定します * initial_data --- テーブル毎の初期データを設定します ''database'' は任意の名前が指定できますが、''connections'' の中で使用する名前と一致している必要があります。''connections''には、複数のデータベースの接続を含める事ができますが、実際に使用されるのは ''database'' で指定されたものだけです。 === connections === 各データベースの設定値には以下の項目が含まれます。 * connection_string --- 接続文字列 * db_file --- データベースファイルのパス (初期設定値は var/db/apricot.sqlite) * username --- データベースのユーザ名 * password --- ユーザのパスワード * driver_options --- データベースドライバー毎のオプション * check_tables --- アプリケーションで使用するテーブルの存在を確認するSQL文 * initial_statements --- 接続直後に実行する初期化SQL文 ''connection_string'' は必須です。''db_file'' は SQLite のようなファイル共有型のデータベースの場合に必要で、''username'' と ''password'' は MySQL のようなクライアント-サーバ型のデータベースの場合に必要になります。''connection_string'' と ''driver_options'' についてはを PHPの[[https://www.php.net/manual/en/pdo.drivers.php|PDO driver-specific documentation]] 参照して下さい。 > 接続設定及び接続文字列の詳細は以下を参照して下さい:\\ https://idiorm.readthedocs.io/en/latest/configuration.html#id1 ''check_tables'' はオプションで、アプリケーションで使用するテーブルの存在を調べるSQLクエリ文を設定します。詳しくは次項の[[#テーブルの作成|Idiormのセットアップ]]を参照して下さい。 ''initial_statements'' はオプションで、データベースとの接続直後に実行するSQL文を設定します。このSQL文は複数指定することができます。 === initial_data === テーブル毎に初期データが設定できます。各テーブルの設定値は以下の通りです。 * exec --- 実行したいSQLを記述します(複数指定可) * rows --- 初期データとして挿入するカラム毎のデータ(複数指定可) ''exec'' には初期データを挿入する前に実行されるSQL文を設定する事ができます。''exec'' には上例のように接尾語として '':{データベース名}'' を付加する事ができます。SQL文がデータベースの種類の依存する場合に使用して下さい。 初期データについては、次項の[[#Idiormのセットアップ]]も参照して下さい。 \\ ===== Idiormのセットアップ ===== Idiormには以下のセットアップファイルが存在します。セットアップの動作をカスタマイズした場合は、このファイルを変更して下さい。 /your-project/config/setup/idiorm.setup.php このセットアップファイルでは以下の事をおこないます: - データベースへの接続 --- ORMオブジェクトの初期化 - テーブルの自動作成 --- 新しくデータベースを作った時 - 初期データの自動作成 --- テーブルが空の時 \\ ==== データベースへの接続 ==== Idiormの設定ファイル( idiorm.setting.php ) に従ってデータベースへの接続を行います。''db_file'' が設定されている場合は、それが設置されるディレクトリを自動作成します。そして、IdiormのORMオブジェクトを初期化し、設定に応じてキャッシングを開始します。ロギングが有効な場合は、Apricotのログイン設定に従ってINFOレベルのログを出力します。 \\ ==== テーブルの自動作成 ==== 新しくデータベースを作った時に、テーブルを自動作成する事ができます。自動作成で使用するSQL文はファイル( ''create.sql'' )の中に保存し、各データベース毎に以下のディレクトリーに配置して下さい。この時、データベースを表すディレクトリー名は設定値である ''database'' と同じにします。 your-project | ├── assets | ├── sql | | | | | ├── sqlite [SQLite用] | | | | | | | └─ create.sql | | | | | ├── mysql [MySQL用] | | | | | | | └─ create.sql テーブル自動作成のトリガーは以下の2つです。この何れかに該当する場合に限り、''create.sql'' が実行されます。''create.sql'' の書式については [[#SQLファイル]] を参照して下さい。 * 設定値 ''db_file'' で指定されいるファイルが存在しなかった時 * 設定値 ''check_tables'' で指定されいるクエリー結果が空の時 一般的に、''db_file'' は SQLite のようなファイル共有型のデータベースの場合に使用し、''check_tables'' は MySQL のようなクライアント-サーバ型のデータベースの場合に使用します。 \\ ==== 初期データの自動作成 ==== 設定ファイルの ''initial_data'' に設定されているテーブルが空の場合、そのテーブルに初期データを自動的に挿入します。これは、テーブル作成の直後だけでなく、全てのレコードが消されテーブルが空になった場合も含まれることに注意して下さい。 \\ ===== データベースの構築 ===== ここでは、[[#テーブルの自動作成|create.sql]] ファイルを使用したデータベースの構築方法について説明しますが、実際のデータベースの構築にあたっては、アプリケーションに応じた戦略を検討して下さい。 Apricotのスケルトンには、ユーザテーブルが含まれています。ユーザテーブルはログイン認証で使用される基本的なテーブルで、Aproctに初期実装されているアプリケーションでは、このテーブルをメンテナンス(新規作成、変更、削除)する機能が実装されています。 Apricotを最初に起動したとき、ユーザテーブルは自動的に作成され、初期データがロードされるように予め設定されています。自動作成するテーブルのSQL文は ''create.sql'' ファイルに格納します。必要に応じて、新しいテーブルを追加するようにして下さい。 \\ ==== userテーブル ==== 以下はuserテーブルの定義です。Apricotのスケルトンで初期設定されているデータベースはSQLiteです。 ^ カラム名 ^ 型 ^^ 主Key ^ 属性 ^ 説明 ^ ^:::^ SQLite ^ MySQL ^:::^:::^:::^ |id|integer|int|●|autoincrement|ID| |account|text|VARCHAR(255)| |unique not null|アカウント| |password|text|VARCHAR(255)| |not null|パスワード| |email|text|VARCHAR(255)| | |Eメールアドレス| |note|text|text| | |備考| |remember_token|text|VARCHAR(255)| | |自動ログイン用| |created_at|text|datetime| |not null|作成日| |updated_at|text|datetime| |not null|更新日| |version_no|integer|int| |default 0 not null|バージョンNo| * ''account'' と ''password'' カラムは、ログイン認証で使用されます。 * ''remember_token'' は自動ログイン用の認証トークンとして使用されます。 * 新しくレコードが挿入される時、''created_at''と''updated_at'' が 設定されます。 * レコードが変更される時、''created_at''と''version_no'' が 設定されます。 * ''version_no'' はレコードのバージョンを表し、楽観的ロックで使用されます。 ユーザテーブルには必要に応じて新しいカラムを追加することができます。 Apricotのスケルトンでは、アプリケーションが使用する全てのテーブルで created_at、updated_at、version_no の3つカラムが存在することを前提しています。この前提を変更する場合は、モデルのベースクラスを変更して下さい。 \\ ==== Raw SQL ===== アプリケーションでは、テーブルを作成したり削除するような生のSQLを直接実行することもあります。このような為に、IdiromではDDL用のSQLを実行するメソッドして ''raw_execute()'' と ''get_db()'' が提供されています。 以下は ''raw_execute()'' の例です。このメソッドは成否を返します。 $successful = ORM::raw_execute('DROP TABLE user'); ''get_db()'' はPHPの[[https://www.php.net/manual/en/class.pdo.php|PDOオブジェクト]]を返します。上の例を''get_db()''を使用して行うと以下のようになります。PDO の ''exec()'' メソッドは作用した行数または失敗した場合にfalseを返します。 $result = ORM::get_db()->exec('DROP TABLE user'); \\ ==== SQLファイル ===== テーブルの自動作成で使用される ''create.sql'' ファイルは、以下のヘルパー関数によってSQL文の配列として読み込まれます。 ^関数^機能^ |file_get_sql(string $filename):array|SQLファイルを読みSQL文の配列を返す| ''file_get_sql()'' 関数 はアプリケーションの中で任意のSQLファイルに使用できます。但し、SQLファイルの保存先は ''create.sql'' ファイルと同じ場所を推奨します。 Idiormのセットアップコードでは、''file_get_sql()'' 関数を使用して以下のように ''create.sql'' を読み込んでSQL文を実行しています。 $sql_text = file_get_sql(assets_dir("sql/{$database}/create.sql")); if (!empty($sql_text)) { foreach($sql_text as $sql) { ORM::get_db()->exec($sql); } } \\ === SQLファイルの形式について === 以下に、Apricotのスケルトンで提供されているSQLite用のSQLファイルを示します。 {{fa>folder-open-o}} ** /your-project/assets/sql/sqlite ** /* * User Table */ create table if not exists user ( id integer primary key autoincrement, account text unique not null, password text not null, email text, note text, remember_token text, created_at text not null, updated_at text not null, version_no integer default 0 not null ); * SQLの文法及び使用できる関数などは使用しているデーターベース( 上例では SQLite )に依存します。 * 行コメント( ''-- Comment'' )とブロックコメント( ''/* Comment */'' )の両方が使用できます。 * 文はセミコロン( '';'' )で区切って複数入力できます。 * 連続する空白( ''TAB'', ''Space'', ''改行文字'' )は1つの空白と同じにみなされます。 \\