いきなり涼しくなってきました。でも湿度が高いのでクーラーは付けています。
さて、昨日の続きで、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);
}