いきなり涼しくなってきました。でも湿度が高いのでクーラーは付けています。
さて、昨日の続きで、WSLのYii2からWindows SQL Serverにアクセスするの Linux側の設定です。
といっても、MicrosoftのWebページに手順が用意されているので、その通りに実行するだけです。
Microsoft Drivers for PHP for SQL Server のインストール
以下のページの「Ubuntu 16.04、18.04、および 19.10 へのドライバーのインストール」の手順を実行するだけです。
注意点1: PHPのバージョン
PHP 7.4系をインストールする手順になっていますが、Ubuntu 18.04にはPHP 7.2系が元々インストールされています。
今のRHEL6/7/8はPHP 7.2系ですので、仕事用に使うのであれば、PHP7.2をそのまま使用した方が良いと思います。
その時には、「手順 1. PHP のインストール」の手順は不要です。
注意点2: apacheのインストール
WSLのUbuntu 18.04であればapacheも最初からインストールされています。 このため「手順 4. Apache のインストールとドライバーの読み込みの構成」の手順も不要です。
確認
上記のMicrosoftのページに書かれている確認用のphpを実行すると、以下のようにアクセスできることが確認できました。
$ php index.php <h1> Results : </h1> Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Express Edition (64-bit) on Windows 10 Home 10.0 <X64> (Build 18363: )
Yii2からアクセスする
Yii2の設定はとても簡単で、common/config/main-local.phpに以下のようなデータベース設定を記述するだけです。 WSL2の場合にはIPアドレスはWindows側のIPアドレスを指定する必要があります。
'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'sqlsrv:Server=127.0.0.1;Database=データベース名', 'username' => 'ユーザ名', 'password' => 'パスワード', 'charset' => 'utf8', ],
これだけで、普通にアクセスできるようになります。
おまけ: SQLのスクリプトを作成
ここまでくれば、後は何とでもなりますが、私はgiiでmoduleを作成してから、以下のようなコードをcontrollers/SiteController.phpに記載して、mysql用のsqlスクリプトを作成しました。
public function actionExport() { $this->create_insert_sql(User::ClassName()); $this->create_insert_sql(Device::ClassName()); } private function create_insert_sql($class) { $table_name = $class::tableName(); $query = $class::find()->select('*'); $dirPath = Yii::$app->basePath . '/data/'; if (!file_exists($dirPath)) { mkdir($dirPath, 0775, true); chmod($dirPath, 0775); } $filename = "$dirPath$table_name.txt"; $fp = fopen($filename, 'w'); chmod($filename, 0666); fwrite($fp, "USE データベース名;\n"); fwrite($fp, "DELETE FROM $table_name;\n"); foreach ($query->each() as $items) { fwrite($fp, "INSERT INTO $table_name VALUES ("); $is_first_value = true; foreach ($items as $key => $value) { if ($is_first_value) { fwrite($fp, "'$value'"); $is_first_value = false; } else { fwrite($fp, ",'$value'"); } } fwrite($fp, ");\n"); } fclose($fp); }