20210413のMySQLに関する記事は12件です。

herokuでマイグレートしようとしたらMysql2::Error: Table already existsが起きたときの解決策

起こったこと Railsでポートフォリオを作成中、デプロイした後にマイグレートしようとしたら、 Mysql2::Error: Table 'users' already exists が吐かれてマイグレートできなくなりました。 原因 原因ははっきりとしていて開発環境でテーブルを増やしてアソシエーションを組んだときに、マイグレーションファイルの作成順序が誤っていて(最初からちゃんとやっておけば良い話)マイグレートに失敗し、マイグレーションファイルの作成日時を手動で変更したことが原因でした。 試してみたこと まず、heroku run rails db:migrate:statusで本番環境のデータベースの状態を確認してみました。 予想通り、マイグレーションのステータスがおかしなことになっています。 本来、テーブルは4つありますが、下から2つ目のファイルは NO FILE となっています。 これが手動でマイグレーションファイルの作成日時を変更した弊害です。 この後、heroku run rails db:migrate:resetでデータベースのリセットを試みましたが、別のエラーが起こりうまくいきませんでした。 解決策 heroku run DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:drop db:create db:migrate を実行します。 このコマンドはデータベースを一度壊して作り直し、マイグレートするのを一度に実行するものです。 これでもう一度heroku run rails db:migrate:statusを実行し、ステータスを確認してみます。 ステータスが正常に戻りました。 他にも方法はあると思いますが私のケースではこのコマンド一発で解決できました。 エラーを通じて 本来、データベースをしょっちゅうresetしたりdropするということ自体、あまり好ましくないものだと思います。設計の甘さで今回のようなことになってしまったので、今後作成していく個人アプリケーションでは後々のことも考えてテーブル設計、実装順序の組み立てをしていこうという学びになりました。 同じようなエラーにあたった方の、助けになれれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】MySQLに接続できないエラー(php_network_getaddresses: getaddrinfo failed: Name or service not known)

Dockerを用いてlaravelの環境構築を試みている時に起こったエラーです。 開発環境 Docker 20.10.5 docker-compose 1.28.5 php 7.2 laravel 7.30.4 Composer 2.0.12 MySQL 8.0 nginx 1.15.12-alpine エラー Dockerで作成したコンテナに入り、MySQLに接続するために php artisan migrateを実行するとターミナルに下記のエラーが表示される。 Illuminate\Database\QueryException SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = development and table_name = migrations and table_type = 'BASE TABLE') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671 667| // If an exception occurs when attempting to run a query, we'll format the error 668| // message to include the bindings with SQL, which will make this exception a 669| // lot more helpful to the developer instead of just the database's errors. 670| catch (Exception $e) { > 671| throw new QueryException( 672| $query, $this->prepareBindings($bindings), $e 673| ); 674| } 675| +36 vendor frames 37 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 解決策 調べてみると上記エラーは.envでホスト名が間違ってる時に出るものだそうです。 .env DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel_local DB_USERNAME=laravel_user DB_PASSWORD=laravel123 docker-compose.yml version: '3' services: #省略 mysql: image: mysql:8.0 container_name: app_db ports: - 3306:3306 environment: MYSQL_DATABASE: laravel_local MYSQL_ROOT_USER: root MYSQL_ROOT_PASSWORD: root MYSQL_USER: laravel_user MYSQL_PASSWORD: laravel123 TZ: 'Asia/Tokyo' volumes: - ./docker-config/mysql/data:/var/lib/mysql - ./docker-config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf depends_on: - mysql-volume mysql-volume: image: busybox volumes: - ./docker-config/mysql/data:/var/lib/mysql #省略 .envの中のDB_HOST=dbが誤ってるということなので調べてみると、 DB_HOSTはserviceの名前らしいです。 今回はdocker-compose.ymlでmysqlと命名しているので合わせる必要があります。 .env DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel_local DB_USERNAME=laravel_user DB_PASSWORD=laravel123 これで再度コンテナ内でphp artisan migrateを実行すれば上記のエラーは解消されます。 おまけ(SQLSTATEエラー) このエラーは.envのどこの設定が間違っているかで表示されるものが違うんじゃないかと思い、ロールバックして試してみます。 DB_CONNECTIONが異なる場合 Database connection [DB] not configured. DB_PORTが異なる場合 SQLSTATE[HY000] [2002] Connection refused DB_HOSTが異なる場合 SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known DB_DATABASEが異なる場合 SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'%' (using password: YES) DB_USERNAMEが異なる場合 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client DB_PASSWORDが異なる場合 SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'%'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RDSでMySQLからAuroraに移行しようとしてハマった

RDSでMySQL5.6のエンジンが非対応になるとのことで、この際Auroraに変えるか、と思ったら、ちょっとハマったので備忘録として残します。 MySQLからAurora MySQLへの移行方法は、以下の公式ブログにベストプラクティスが記載されています。 簡単に手順を説明すると MySQLインスタンスからAuroraリードレプリカを作成 インスタンスが立ち上がったら、ステータスを確認して、レプリケーションできてる事を確認 (書いてないけど)WebアプリケーションのDBの向き先をAuroraに変更 MySQL側のインスタンスを停止 親切に画面のスクリーンショットまで載っており、途中までは問題も起きずに進められたのですが、 レプリケーションのMasterとなっているMySQL側のインスタンスを停止ができなくて詰まりました。 アクションから停止を選択し、進めていくと、 "Cannot stop or start a Read-Replica instance" というメッセージが出て、停止できない。 「いや、これリードレプリカじゃなくてMasterなんだが? Masterを停止したらリードレプリカが昇格するんちゃうんか? 話がちゃうで」 という疑問もありましたが、とにかく、レプリケーションの解除を行う必要がありそうです。 色々情報を彷徨ったのですが、ようやく見つけた方法がレプリカ側を昇格させるという方法。 RDSインスタンスの一覧から、リードレプリカとなっているのAurora クラスタ を選択し、アクションから 昇格 を選択する。 昇格自体は10秒程度で完了したと思います。恐らくダウンタイムも発生していないと思われます。多分... 昇格が完了後、無事MySQLインスタンスは停止できましたとさ。 めでたしめでたし。 追記 ほかの方法を記載している記事を発見しました。 上記の記事では、MySQLクライアントからコマンドをコールする事でレプリケーションを解除しています。 私は昇格によって解除したので、現在でもコマンドでの解除が有効かどうかは検証していません。 下記は上記記事からの引用です。 mysql> call mysql.rds_reset_external_master; +----------------------+ | message | +----------------------+ | Slave has been reset | +----------------------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IntelliJ + Dockerでローカル環境を極力汚さずPHP+MySQL開発環境を構築する

概要 PHP + MySQL の環境を docker-compose で構築し、IntelliJ上でdockerに接続してPHPUnitをする手順を記載してます。 Docker上に構築した実行環境を使うようにすることで、いちいちローカルにPHPやMySQLをインストールしなくてもよくなるようになり、ローカル環境の汚染を防ぐことができ、「案件によって使うMySQLのバージョンが異なるせいで毎回再インストールしないといけないんだよぉ」みたいな煩わしさから解放されます。 かつ、ローカルに環境を構築していた時と同様にIDEからサクっとテストを走らせることができるため、なんかハッピーなアレになれます。多分。 実行環境 Windows 10 64bit IntelliJ Ultimate Edition 2021.1 Docker Desktop v20.10.5 今回はWindowsで構築したけど、Macでも普通にできるはず。 前提 DockerやIntelliJ はインストール済 IntelliJ のプラグインのインストール 以下をインストールしておきます。 PHP PHP Docker PHP Remote Interpreter PHPUnit Enhancement Docker とりあえずトライ&エラーで入れたプラグインなんで、いくつか不要なものもあるのかも。 Dockerfileなどの作成 以下のフォルダ構成にします。 <Root> ・ local // Docker環境用 ├ php │ ├ php.ini │ └ Dockerfile └ mysql // 最終的にデータファイルが入る ・ src // ソースファイル ・ docker-compose.yml local/php/Dockerfile FROM php:7.2-fpm RUN apt-get update RUN apt-get install -y vim git zip unzip RUN docker-php-ext-install pdo_mysql COPY --from=composer /usr/bin/composer /usr/bin/composer COPY php.ini /usr/local/etc/php/ local/php/php.ini date.timezone = "Asia/Tokyo" docker-compose.yml version: '3' services: # Webサーバーとして動かす場合(今回はユニットテスト書くのが目的なのでこの部分は割愛) # nginx: # image: nginx:latest # ports: # - 8080:80 # volumes: # - ./local/nginx/nginx.conf:/etc/nginx/conf.d/default.conf # - ./src:/var/www/html # depends_on: # - php php: build: ./local/php volumes: - ./src:/var/www/html depends_on: - db db: image: mysql:5.7 ports: - 13306:3306 volumes: - ./local/mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: password container_name: mysqldb phpmyadmin: image: phpmyadmin/phpmyadmin:latest ports: - 8888:80 depends_on: - db これらのイメージ&コンテナを作成しておき、 phpにCLIで入って、 composer install をやっておきます。 IntelliJの設定 Dockerの設定 File -> Settings にてSettingsダイアログを出し、 Build, Execution, Deployment -> Dockerを選択します。 ひとつDockerのサービスを作成しておけばOKです。 PHPの設定 Languages & Frameworks -> PHP を選択し、CLI Interpreter の「...」ボタンを押下 CLI Interpreters から設定を作成し、「From Docker, Vagrant, VM, WSL, Remote...」を選択 Docker Composeを選択し、実行サービス(今回の例だとphp)を選択します。 最初の設定のは不要な場合は削除しちゃいます。 PHPUnitの設定 Languages & Frameworks -> PHP -> Test Frameworks を選択し、CLI Interpreter に、上記で作成したインタプリタを選択します。 テストの設定 最後に、 実行の設定を行います。 Run / Debug Configurationsから、PHPUnitのを作成 あとはいつも通りの感じでテストを起動すると、IntelliJ は自動的にDocker上の実行環境を使ってテストを行い、MySQLにも接続するテストが実行できます。 まとめ いい時代になりましたねぇ。Docker便利。 そのうちGoやJavaやFlutterとかも同様のやり方でできないか調べたい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ansibleでrundeckサーバを作ってみた

前提条件 ・使用するもの  AWSアカウント  EC2(Amazon Linux) ・2台構成とし、以下の呼び方とする  Ansibleサーバ:AnsibleがインストールされているEC2  rundeckサーバ:rundeckをインストールさせたいただのEC2(ansibleコマンドにてrundeckがインストールされる予定) 大まかな流れ 上記を実施する為の大まかな流れは以下の通り ⑴ansibleサーバの準備 ⑵ansibleのファイル構成を考えて作成 ⑶ansible-playbookコマンドの実行=rundeckインストール 手順⑴ ①ansibleサーバを作るべく、ansibleをインストールする # sudo amazon-linux-extras install ansible2 ⇦インストールする # ansible --version ⇦バージョンを確認する ②公開鍵を作成する # cd /home/ec2-user/.ssh ⇦ディレクトリを移動する # ssh-keygen -t rsa ⇦公開鍵を作成する ③作成した公開鍵をrundeckサーバへコピーする # ssh-copy-id ec2-user@rundeckサーバのIPaddress ④ansibleサーバからrundeckサーバへログインできることを確認する # ssh ec2-user@rundeckサーバのIPaddress 手順⑵ ここから作業は作成したansibleサーバ内で行います。 ①iventory.iniファイルを作成する # iventory.ini [rundeck_servers] rundeckサーバのIPアドレス ②main.ymlを作成する # main.yml --- - hosts: rundeck_servers become: yes tasks: - include_tasks: rundeck.yml ③propertiesファイルを作成する # rundeck-config.properties.txt #loglevel.default is the default log level for jobs: ERROR,WARN,INFO,VERBOSE,DEBUG loglevel.default=INFO rdeck.base=/var/lib/rundeck #rss.enabled if set to true enables RSS feeds that are public (non-authenticated) rss.enabled=false # change hostname here grails.serverURL=http://rundeckサーバのIPアドレス:4440 ⇦作成したrundeckサーバのIPアドレスを指定して記載 # framework.properties.txt # framework.properties - # # ---------------------------------------------------------------- # Rundeck server connection information # ---------------------------------------------------------------- framework.server.name = localhost framework.server.hostname = localhost framework.server.port = 4440 framework.server.url = http://rundeckサーバのIPアドレス:4440 ⇦作成したrundeckサーバのIPアドレスを指定して記載 # ---------------------------------------------------------------- # Installation locations # ---------------------------------------------------------------- ④rundeck.ymlを作成する --- - name: Install java yum: name: java state: present - name: get a repository yum: name: http://repo.rundeck.org/latest.rpm state: present - name: Install rundeckd yum: name: rundeck state: present - name: create directory file: path: /var/lib/rundeck/lib state: directory owner: rundeck mode: 0755 - name: install wget yum: name=wget state=installed - name: install JDBC ⇦mysqlと紐付けを実施したい場合は配置する必要がありました get_url: url: https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.23/mysql-connector-java-8.0.23.jar dest: /var/lib/rundeck/lib - name: enable and start rundeckd systemd: name: rundeckd enabled: yes state: started - name: Install rundeck-cli yum: name: rundeck-cli state: present - name: Set a hostname ansible.builtin.hostname: name: rundeck - name: restart rundeckd systemd: name: rundeckd state: restarted - name: copy rundeck-config.properties copy: src: /home/ec2-user/roles/rundeck/templates/rundeck-config.properties.txt dest: /etc/rundeck/rundeck-config.properties backup: no - name: copy framework.properties copy: src: /home/ec2-user/roles/rundeck/templates/framework.properties.txt dest: /etc/rundeck/framework.properties backup: no 手順⑶ ①ansible-playbook コマンドを実行する # ansible-playbook -i iventory.ini main.yml --ask-become-pass ※「--ask-become-pass」を付けないとsudo権限がなく実行出来ないとのエラー発生したので必要でした。 次回はmysqlとの紐付けをしたymlを公開したいと思います。 ご覧いただきありがとうございました。 参考にさせていただいたもの
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laradock+Docker+MySQL+Herokuでサイトを公開してみた。

記事を書くに至るまで 独学でProgate、ドットインストールなどを駆使してプログラミングを勉強している現大学生です。挫折をしながらLaradockで作ったサイトをHerokuで公開できたのでその方法を書き残しておきます。 まず、 どのように公開に至ったかというと、 自分のサイトを作りたい!→管理画面があるようなサイトを作りたい!→PHPでできるらしい!データベースはMySQLで!→laravelというフレームワークがあるらしい!→laradockというdockerとlaravelが合体したものがあるらしい! また、 自分のサイトを作りたい!→サーバーレスというのがあるらしい!→HerokuというPaaSがあるらしい! よってLaradock+Docker+MySQL+Herokuという環境に至りました。 より良い環境もあるかとは思いますが、ひとまず公開できたのでこのやり方を自分で見返すためにも紹介していきたいと思います。 はじめに 必要なもの(主はmacで開発しています) * docker-composeのインストール * docker環境(runnning状態であること) * Herokuのアカウント(無料ですが、クレジットカードの登録をしないとできないこともあるので登録が必要) これがあればとりあえずいけると思います。 まず デスクトップとかどこでもいいので、作成物をまとめるフォルダを作成して、そこにlaradockをダウンロードします。 $ mkdir MyLaradock $ cd MyLaradock $ git init $ git submodule add https://github.com/Laradock/laradock.git git submoduleとは何か?一旦無視で大丈夫です!このまま行きましょう。 説明しておくと、laradockは言うなれば、サイトの地盤作成キットのようなものです。なんでも入ってます。ですので開発するときは必要なものだけを起動させる必要があります。(という解釈で合ってますよね?) laradock内に移動してあげて、laradockの設定をしていきます。はじめにおおもとの設定ファイル.envを作る必要があります。laradock内にはenv-exampleというのがあらかじめあるのでそれを.envにしてあげるといいですね。 $ cd laradock $ cp env-example .env そしたら.envファイルの設定を少しいじります。つまりlaradockの設定をしていきます。 APP_CODE_PATH_HOST=../の部分を変えましょう。 これはwebアプリのソースファイル(laravelの中身)をどこにするかですが、わかりやすいように名前をつけておいた方がいいので、値を../srcなどに変更します。他にも変えておいた方がいい部分があるのでそれらもまとめて変更していきましょう。 .env APP_CODE_PATH_HOST=../ APP_CODE_PATH_HOST=../src //変更! COMPOSE_PROJECT_NAME=laradock COMPOSE_PROJECT_NAME=laradock-test //プロジェクト毎に新しいlaradock環境を作りたい場合変更しておく DATA_PATH_HOST=~/.laradock/data DATA_PATH_HOST=.laradock/data //データの保存先をlaradock毎に分離したい場合変更しておく これで/MyLaradock/srcの中にアプリのファイルが入る!とlaradockが認識してくれました。 それでは早速、/MyLaradock/srcの中にlaravelを入れていきましょう。ここからdockerと一緒に動かしていくことになります。 ここで立ち上げるのはworkspaceという、のちにlaravelを入れるためのコンテナ、そしてwebサーバーも必要ですのでnginxというwebサーバーも立ち上げます。 /MyLaradock/laradock $ docker-compose up -d workspace nginx docker-compose upというコマンドは、イメージを作成して、さらにコンテナを作成・起動するコマンドだと思っていただければOKです!docker-compose psとコマンドを打って、コンテナが稼働状態(Stateの部分がUpに)なっていれば大丈夫です。次に進みましょう! Laravelをworkspaceにダウンロード workspaceの中に入ってそこにlaravelをダウンロードしていきます。 /MyLaradock/laradock docker-compose exec workspace bash //workspaceの中に入ります //↓ここからworkspace内のコマンド↓ # composer create-project laravel/laravel . --prefer-dist //laravelをダウンロード # exit //コンテナから出る これで/MyLaradock/srcにlaravelのファイルがたくさん入ったかと思います。 しっかり入っているかページを確認してみましょう。 Macであればhttp://localhostにアクセスしてみて、laravelの画面になっていれば上手くいっています。ナイス!! データベースの設定をしていく 今回はMySQLを使っていきたいと思います。ちなみにHerokuでは無料で使用できるデータベースの容量に制限が設定されているのですが、容量的には圧倒的にPostgreSQLがいいです。今回は個人的にMySQLしか予習していなかったのでMySQLで構築していきます。 まず、/MyLaradock/laradock/.envのMYSQL_VERSIONの欄を5.7にします。設定しないと最新バージョンになるのですが、とある設定を追加でしないとエラーが出てしまうので、特に理由がなければ5.7にしましょう。 /MyLaradock/laradock/.env ### MYSQL ################################################# //変更後 MYSQL_VERSION=5.7 //ここを5.7にしました MYSQL_DATABASE=default MYSQL_USER=default .envファイルはlaradockのものとlaravelのものと複数あるので間違わないように注意しましょう。 バージョンを変更したらコンテナを起動させます。 /MyLaradock/laradock $ docker-compose up -d mysql 念の為またdocker-compose psでコンテナの稼働状態を確認しましょう。データベースのコンテナが稼働していたらOKです! laravelのデータベースの設定もしましょう。laravel内の.envを編集します。 /MyLaradock/src/.env DB_CONNECTION=mysql DB_HOST=mysql //mysqlに変更しました DB_PORT=3306 DB_DATABASE=default //laradock/.envのMYSQL_DATABASEと同じ値にする DB_USERNAME=default //laradock/.envのMYSQL_USERと同じ値にする DB_PASSWORD=secret //laradock/.envのMYSQL_PASSWORDと同じ値にする ここまで来たら設定はOKです!これからはlaravelをいじってサイトを作っていきますが、ここは自分の好きなようにサイトを作ってください。ここではサイト作成に必要な設定だけ紹介して、laravel自体のコマンドなどは省略させていただきます。 Laravel内の細かな設定 laravelをいじって、herokuで公開する上で色々とつまづいたところがあったのでここではその細かな設定をしていきます。 Target class [〇〇〇Controller] does not exist対策 RouteServiceProvider.php protected $namespace = 'App\Http\Controllers'; //追加 public function boot() { このようにすることでクラスがないと言われなくなります。 laravelをいじる上での一つの大きなエラーを起こす要因としてuse宣言や名前空間がうまくできていないということがあります。もしエラーが起きた場合は、その使っているクラスがきちんとuse宣言されているかなど確認すると良いかと思われます。 マイグレーション時のエラー対策 herokuの無料プランでは、通常の文字数だと規定のデータ量を超えてしまい、マイグレーション時にエラーが出てしまいます。そのために文字数を制限する必要があります。 AppServiceProvider.php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; //追加* class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { Schema::defaultStringLength(191); //追加* } HTTPに接続になってしまうことへの対策 このままデプロイしてサイトを作るとhttpになります(鍵マークがついていない状態)。herokuは安全なのでhttpであっても問題ないらしいのですが、できれば鍵マークついていた方が気持ち的にいいと思うので、一部変更してhttps接続になるようにします。 app/Http/MiddleWare/TrustProxies.php class TrustProxies extends Middleware { /** * The trusted proxies for this application. * * @var array|string|null */ protected $proxies = '*'; //これに変更する Herokuにデプロイする いよいよHerokuを使ってサイトを公開していきます! herokuにログインしてアプリを作成していきます。 場所は/MyLaradock上でターミナルを使ってログイン、アプリ作成して、アプリをリモートリポジトリとして登録していきます。また、herokuでサイトを公開するにはProcfileというものが必要なのでそれも作成します。 $ heroku login ログインしたら,,, $ heroku create [アプリ名(好きな名前をつけてください] --buildpack heroku/php $ git remote add heroku https://git.heroku.com/[アプリケーション名].git $ cd MyLaradock/src $ echo web: vendor/bin/heroku-php-apache2 public/ > Procfile ログインしてレポジトリを登録し、Procfileというものをsrcディレクトリ内に作成しました。 場所は再び/MyLaradockに戻しておいてください。 続いてherokuとデータベースの紐付けをしていきます。 herokuでデータベースを使うにはアドオンという機能を使ってデータベースを追加し、紐付け作業をします。MySqlを使うにはcleardbというアドオンを使います! $ heroku addons:add cleardb ここから紐付けして、このherokuアプリのデータベースはこれですよ、と教えてあげます。 どうやるかというと、cleardbにはCLEARDB_DATABASE_URLという値があります。この値とherokuのconfigを紐付けるといった感じですね。やっていきましょう。 $ heroku config | grep CLEARDB_DATABASE_URL CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true ///このurlを参考にして、それぞれの値を地道にheroku:configに入れていきます。/// $ heroku config:set DB_CONNECTION=mysql $ heroku config:set DB_DATABASE=[データベース名] $ heroku config:set DB_HOST=[ホスト名] $ heroku config:set DB_USERNAME=[ユーザー名] $ heroku config:set DB_PASSWORD=[パスワード] HerokuアプリにAPP_KEYを追加 herokuアプリに環境変数としてAPP_KEYを設定してあげる必要があります。 やっていきましょう。 $ cd MyLaradock/laradock $ docker-compose exec workspace php artisan --no-ansi key:generate --show base64:xxxxx /// この[base64:xxxxxxx]をheroku:configに設定します cd .. ///MyLaradockに移動 $ heroku config:set APP_KEY=base64:xxxxx $ heroku config ///これを実行してきちんと設定されているか確認しましょう。 最後! gitにpushしていきます! $ cd MyLaradock $ git add . $ git commit -m 'create laradock app' $ git subtree push --prefix src/ heroku master ///上だけだとデータベースの設定は反映されないので 'php artisan migrate'で設定を反映させて終わりです! $ heroku run "php artisan migrate" これでできるはずです ターミナルで heroku openを実行してきちんとサイトが表示されるか確認してみてください! 以上で終わりたいと思います。ここまで読んでくれてありがとうございます。 間違った認識をしている部分もあるかと思います!笑 指摘や上手くいかないときはコメントしていただけると幸いです!もっと理解を深めたいので(^^) ありがとうございました! どんどんlaravel勉強していくぞー! とても参考にしたサイトはこちら
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

04/17(土)用 Windows10にDockerでRails6+MySQLの環境構築

環境構築の手順書です。 山岡楓が制作しています。 Railsのデフォルトホーム画面を表示させるところまでです。 環境 Windows10 Ruby2.7.1 Rails6.0.3.1 MySQL8.0 1.Docker for Windowsをインストール https://hub.docker.com/editions/community/docker-ce-desktop-windows/ 上記リンクにアクセスしてインストールする。 インストールが出来たら一度再起動して、Dockerを起動させてください。 2.必要ファイルの作成 どこまでもいいので任意の場所にディレクトリを作成する。デスクトップとか。 ここではRails_appというディレクトリを作成します。(名前はなんでもいい) で、VScodeでフォルダを開いてください。 (エディターはなんでもいいですが、VScodeがいいと思います。) インストールがまだの場合は以下リンクからインストール https://azure.microsoft.com/ja-jp/products/visual-studio-code/ Dockerfileの作成 VScodeでディレクトリを開けたらディレクトリ内にDockerfileを作成し、 以下のように記述します。 FROM ruby:2.7 RUN apt-get update -qq && apt-get install -y nodejs yarnpkg RUN ln -s /usr/bin/yarnpkg /usr/bin/yarn RUN mkdir /app WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock RUN bundle install COPY . /app # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"] Gemfileの作成 次に同じ階層にGemfileを作成し、以下のように記述します。 source 'https://rubygems.org' gem 'rails', '~>6' もう一つGemfile.lockというファイルを作成します。 中身は空でOKです。 entrypoint.shの作成 次にDockerfileの中でENTRYPOINTとして定義しているentrypoint.shの作成をします。 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /app/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" docker-compose.ymlの作成 最後にdocker-compose.ymlというファイルを同階層に作成し、以下を記述してください。 docker-compose.yml version: '3' services: db: image: mysql:8.0 volumes: - ./tmp/db:/var/lib/mysql environment: - MYSQL_ALLOW_EMPTY_PASSWORD=1 web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/app ports: - "3000:3000" depends_on: - db MYSQL_ALLOW_EMPTY_PASSWORDを設定することでpasswordが空でもrootで接続できるようにしておきます。 3.Rails new / docker-compose buildを行う VScodeのターミナルを開き、作成したディレクトリの階層にいる事を確認したら、 以下を実行してください。 $ docker-compose run web bundle exec rails new . --force --database=mysql --forceは既存のファイルを上書き、--databaseでMySQLを指定しています。 実行完了したらビルドを行います。 $ docker-compose build 4、DBのホスト名の変更 / docker-compose upを行う 現状だとデータベースへの接続が出来ないので、 最初に作成したディレクトリ内に出来たconfig/database.ymlのhostの値をdbという値に置き換えてください。 ※全部コピペはしないでください。 database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: host: db development: <<: *default database: app_development test: <<: *default database: app_test ここのdbがコンテナ名になります。 これが出来たら再度docker-compose buildを行ってからdocker-compose upを行います。 この状態でlocalhost:3000に接続するとおそらくエラーが出ます。 Webコンテナがmysql8.0のcaching_sha2_password認証方式に対応していない為です。 次の手順で認証方式をmysql_native_passwordに変更します。 5.MySQLの認証方式の変更 まずDBコンテナに入ります。 (VScodeでdocker-compose upを行っていると思うので、powershellを使って該当のディレクトリを開いてください。) そこでbashを起動します。 docker-compose exec db bash その後、mysqlコマンドで接続します。 mysql -u root 場所がmysql>になっている事を確認したら、 下記のクエリを実行してみてください。 mysql> select User,Host,plugin from mysql.user; すると以下のようなユーザ一覧と認証方式が出てきます。 +------------------+-----------+-----------------------+ | User | Host | plugin | +------------------+-----------+-----------------------+ | root | % | caching_sha2_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+ 5 rows in set (0.00 sec) 上記で出てきたrootのpluginにあるcaching_sha2_passwordをmysql_native_passwordに変更します。 今回対象のroot@%のユーザ設定をALTER USERを使って変更します。 下記のクエリを実行してください。 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY ''; 実行出来たら改めてselect User,Host,plugin from mysql.user;を実行すると、 +------------------+-----------+-----------------------+ | User | Host | plugin | +------------------+-----------+-----------------------+ | root | % | mysql_native_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+ 5 rows in set (0.00 sec) 上記のような表示に変わっていると思います。 その後exitを2回実行して、元いた階層に戻ります。 で、階層が作成したディレクトリなのを確認出来たら以下を実行します。 $ docker-compose exec web bundle exec rails db:prepare 6.Railsのホーム画面にアクセス DBを作成し、localhost:3000すると、Railsのホーム画面にアクセスできるようになります。 環境構築は以上です。 お疲れ様でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【SQL】新しいテーブルを作って、値を入れてみる。no.3

こんにちは、まゆみです。 SQLについての記事をシリーズで書いています 今回は第3回目になります 前回・前々回の記事では、SQLの周辺情報の概要をお伝えしてきました。 今回の記事から、実際にSQLを書いていこうと思います。 ではさっそく始めていきますね。 SQLのドキュメント SQLのドキュメントで一番整理されてて使いやすい(私の主観ですが...)のは、w3schoolsなので、こちらのサイトを使いながら学習されることをオススメします。 SQLでテーブル型のデータベースを Create (作る) Read (読み込む) Update (更新する) Destroy (削除する) をしていくことを今回の記事から学習していきましょう。 データベースの専門用語でCRUD(クラッド)と呼ばれます。 SQLを書くIDE(Integrated Development Environment) では、SQLは何者なのか?MySQLとどう違うのか分かったところで、(そんなこと知らないっていう人は、こちらの記事を参考にどうぞ)SQLを練習してみましょう。 SQLを気軽に練習してみたい http://sqlite.com/のサイトにアクセスしてみましょう では準備ができましたら、さっそく Create でテーブル形式のデータベースを作っていきましょう Create テーブルを作る w3schools のチュートリアルを見てみると、『SQL Create Table』と書かれた項目がありますので、そちらを開いてみましょう CREATE TABLE テーブルの名前 テーブルを作ると言っても ①テーブル名 ②それぞれのコラムに入る値のデータタイプ(int, string, money, etc...) のみを定めることになります。 値を入れていくプロセスは、また別の命令を書くことになるので、そのことは頭の隅に置いておいてくださいね。 上記のようなテーブルを作りましょう テーブル名は『customers』 id のデータ型は『INT』 name, addressのデータ型は『STRING』 ですね。 ドキュメントを参考に同じようにコードを書きます。 それらが書けたら、テーブルを作る最後の締めくくりにするのは、『primary key』を設定する事です。。 Primary Keys を設定する事によって、データを検索するときにそのデータを特定することができます。 w3schools に、Primary Keys を設定する仕方が載っていますので、開いてみましょう まず、Primary Keys に設定するカラムに『NULL』が格納されてはダメなので、今回Primary Keysにする『id』の横に『NOT NULL』と書きましょう。 そして一番下に、 PRIMARY KEYS(id) と書きます。 『RUN』で実行すると新しいテーブルが出来上がります。 テーブルに値を入れる(insert) 先ほど言ったように、テーブルを作ってもまだ値が入っていない状態です。 値を入れるには、『INSERT INTO』を使います w3schoolsのドキュメントを見てみます ①コラム名を明示しながら、値を入れるか ②値のみを書くか になります。 今回は、②の方法で値を入れてみましょう 必要なコードが書けたら、『RUN』で実行しましょう 無事、テーブルに値を入れることができました。 もし仮に、今の時点で、コラムの値が欠けているデータをテーブルに入れたい時は ①の方法で、コラム名も明示しながらテーブルを作ります。 例えば、顧客Mayumi のaddressの情報はまだ手に入っていないとしましょう 値を入れたいコラムのみを指定します 『NULL』と表示されます ただし、この時も、Primary Key を設定しているコラムに値を入れないということはできません。 まとめ 今回の記事はこれくらいで締めくくらせていただきます。 次回の記事では、作ったテーブルから実際にデータを読み込む方法を書いていこうと思います
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[MySQL] DBバックアップと復旧する方法

[MySQL] DBバックアップと復旧する方法 DBバックアップ $ mysqldump -u (ユーザー[ex:root]) -p バックアップするデータベース名 テーブル名1 テーブル名2 > バックアップファイル名.sql $ mysqldump -u (ユーザー[ex:root]) -p --all-databases > バックアップファイル名.sql DB復旧 $ mysql -u (ユーザー[ex:root]) -p 復旧するデータベース名 < バックアップファイル名.sql $ mysql -u (ユーザー[ex:root]) -p < バックアップファイル名.sql DBバックアップ(workbench) ① ② ③
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[MySQL] ユーザー追加、削除、権限付与する方法

[MySQL] ユーザー追加、削除、権限付与する方法 接続 $ mysql -u root -p ユーザー確認 mysql> use mysql; mysql> select host,user from user; ユーザー追加 mysql> create user 'ユーザー'@'localhost(又は%)' identified by 'パスワード'; ①%は外部から接続を可能よする設定です。 ユーザー削除 mysql> drop user 'ユーザー'@'localhost'; ユーザー権限付与 mysql> grant all privileges on *.* to 'ユーザー'@'localhost'; mysql> grant all privileges on DB名.* to 'ユーザー'@'localhost'; mysql> grant all privileges on DB名.テーブル名 to 'ユーザー'@'localhost'; mysql> grant select on DB名.テーブル名 to 'ユーザー'@'localhost'; mysql> grant update(カラム2, カラム1) on DB名.テーブル名 to 'ユーザー'@'localhost'; ①all privieges はすべての権限を付与する意味です。 ②.はすべてデータベースそして、すべてのテーブルを指定する意味です。 ③@後ろに特定IPを設定できます。 ユーザー権限削除 mysql> revoke all on DB名.* from 'ユーザー'@'localhost'; ユーザー権限確認 mysql> show grants for 'ユーザー'@'localhost';
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【SQL】SQLとMySQLの違いをざっくり解説 no.2

こんにちは、まゆみです SQLについての記事をシリーズで書いています 今回は第2回目になります 前回の記事では、『SQLとNoSQL』の違いや、それぞれの長所・短所について書かせていただきました。 今回は、『SQLとMySQL』の違いについて書かせていただきます ではさっそく始めていきますね。 DatabaseとDatabase Management System について SQLについて話す前に、Database とDatabase Management Systemとは一体何か?についても話しておきますね。 例えばあなたが、マッチングアプリを使っているとします。 その時、会員の写真・プロフィール・個人情報などデータが整理されて格納されているものが『Database』です。 そのDatabase をアップデートしたり、削除したりするための橋渡しをしてくれるのが『Database Management System』(DBMS)になります。 情報を整理整頓して蓄えている図書館をDatabaseと例えれば、その情報を管理している図書館司書がDatabase Management System とも言うことができますね。 SQL vs MySQL SQLはStructured Query Language と名前に『language(言語)』がついていることからもわかるように、Databaseに語りかける言語そのものになります。 プログラミングにおいてデータベースへのアクセスのために、他のプログラミング言語と併用される。 引用元:wikipedia(SQL) そしてMySQLはDatabase Management System の名称だということができます MySQL(マイ・エスキューエル、英語圏ではマイ・シークルとも)は、オープンソースのリレーショナルデータベース管理システム(RDBMS)である。 引用元:wikipedia(MySQL) まとめ 今回の記事はここで締めくくらせていただきます。 SQLを使うDatabase Management System はMySQL以外にもあり、MySQLでSQLを使った命令の仕方を習得すれば、他のDatabase Management System にスイッチするのは比較的簡単でしょう Database Management Systemに色々な種類があるのは、そこで使われている言語が違うからではなく、それぞれのDatabase Management Systemが違った特色を持つからです。 では次回はいよいよ、SQLの書き方について書いていきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

各種RDBに格納できる文字列の最大長

MySQL5.6 PostgreSQL12.4 SQL Server 2019 型 longtext text nvarchar(MAX) 最大サイズ 約4ギガバイト 約1ギガバイト 約2ギガバイト 最大文字数 約20億文字 約5億文字 約10億文字 参考 *1 *2 *3 *1 https://dev.mysql.com/doc/refman/5.6/ja/string-type-overview.html *2 https://www.postgresql.jp/document/12/html/datatype-character.html *3 https://docs.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql 文字数は、最大バイト数からUTF-16の2バイト文字で概算しています。 補助文字を使用した場合や、(MySQLやPostgreSQLで)別の文字エンコーディングを使用した場合など誤差が生じます。 なお、この記事を書いた時点で日本語wikipediaの最長ページは「英雄伝説 軌跡シリーズの登場人物」の1,391,754バイト(約40万文字)だそうなので、余裕で格納できますね。 RDBの選定にあたって、文字列サイズの制限を気にする必要はなさそうです。 参考: https://qiita.com/marcodi/items/fe35e066d270306e0256
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む