47歳でやむなくセミリタイア

病気のためセミリタイアをすることに。現在は週20時間程度のバイトをしています。その他、雑多なことを記録として書いています。

技術メモ: Yii2からSQL Serverにアクセスする(Linux編)

いきなり涼しくなってきました。でも湿度が高いのでクーラーは付けています。

さて、昨日の続きで、WSLのYii2からWindows SQL Serverにアクセスするの Linux側の設定です。

といっても、MicrosoftのWebページに手順が用意されているので、その通りに実行するだけです。

Microsoft Drivers for PHP for SQL Server のインストール

以下のページの「Ubuntu 16.04、18.04、および 19.10 へのドライバーのインストール」の手順を実行するだけです。

docs.microsoft.com

注意点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);
    }