20220114のMySQLに関する記事は7件です。

MarinDBのdelimiter

delimiterについて この記事は主の備忘録用の物です。 投稿初期のものなので、諸々許してください。 目的 MariaDBで、;を実行コマンドとして機能させないように、delimiterをつかおうと思ったのですが、すこし手こずりましたので、その解決方法の共有です。 エラーの内容 ''' MariaDB [test_db]> delimiter// -> ; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'delimiter//' at line 1 ''' 解決方法 解決方法はいたってSimpleでした。 delimiterを大文字で使う たったこれだけです。 以上でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker compose環境のrailsでDB関連のエラーが出たら確認することまとめ

環境 docker compose mysql rails6 rails初心者が色々迷走しているうちに様々なエラーに出会ったのでまとめてみます。 エラー データベースがない時に出るエラーです。 error.rb ActiveRecord::NoDatabaseError: Unknown database 対応 データベースがあるかを確認します。 checkdb.sh #execコマンドでrailsコンテナの中に入ります。 $ docker exec -it xxxxxxxxxx bash #railsコンテナの中からmysqlコンテナに接続しつつmysqlを立ち上げます。 root@xxxxxxxxxx:/app# mysql -u root -p -h db #ここでmysqlが立ち上がらない場合そもそもdockerコンテナ同士の通信がうまく行っていないので下の「dockerコンテナ間の通信を確認する」を見てください。 #mysqlが立ち上がった場合はshow databasesでデータベースがあるか確認します。データベース名はrailsアプリの/config/database.ymlでdatabase: rails_sample_dvなどと記載されています。 MySQL [(none)]> show databases; #データベースがなかった場合は作成します。 MySQL [(none)]>exit root@xxxxxxxxxx:/app# rails db:create root@xxxxxxxxxx:/app# rails db:migrate これでデータベースが作成されるので0.0.0.0:3000などでアクセスができるようになります。 dockerコンテナ同士がつながっていなそうな場合 docker-compose.ymlの設定を確認します。 以下db接続関連の項目のみを書き出してみます。 これらがない場合は書き足してみてdockerを再構築 (環境によってはimage、volumeを削除してdocker compose build --no-cacheなどとすると確実かもしれません。) してみて再度ウェブコンテナからmysqlに接続できるかを確認します。 docker-compose.yml version: "3" services: app: depends_on: - mysql mysql: volumes: - mysql-volume:/var/lib/mysql environment: - MYSQL_ALLOW_EMPTY_PASSWORD=yes ports: - "3306:3306" volumes: mysql-volume: railsのdatabase.ymlの記述が間違っていたときのエラー 自分の場合は以下のエラーがブラウザでアクセスした時に出ました。 error1.rb ActiveRecord::ConnectionNotEstablished No connection pool for 'ActiveRecord::Base' found. error2.rb Puma caught this error: Cannot load database configuration: そしてその状態でrails consoleを立ち上げようとして以下のエラーに遭遇 error3.sh webapp/config/database.yml:33:in `<main>': Cannot load database configuration: undefined method `[]' for nil:NilClass (NoMethodError) ちなみにその時のdatabase.ymlは以下 database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: 5 timeout: 3306 host: mysql development: <<: *default username: root host: mysql database: rails_sample_dv socket: /tmp/mysql.sock # test: # <<: *default # username: root # host: <%= ENV['DB_HOST'] %> # database: rails_sample_dv # socket: /tmp/mysql.sock # production: # <<: *default # username: <%= Rails.application.credentials.db[:user] %> # host: <%= Rails.application.credentials.db[:host] %> # password: <%= Rails.application.credentials.db[:password] %> # database: <%= Rails.application.credentials.db[:name] %> これはなぜかコメントアウトしている行が読み込まれているようで 以下のようにコメントアウトしている部分を削除したらとりあえずエラーは解消されました。 database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: 5 timeout: 3306 host: mysql development: <<: *default username: root host: mysql database: rails_sample_dv socket: /tmp/mysql.sock master.key、credentials.yml.encを作り直してみる railsアプリの/configディレクトリにmaster.key、credentials.yml.encというファイルがあります。 これらがなかったり、なんらかの影響で変更されたりした場合railsアプリが立ち上がらない場合があります。 そんな時は念の為2つのファイルをバックアップしてから 作成し直すことでアプリが立ち上がる場合もあります。 作成し直す際は前述同様docker execコマンドでrailsコンテナにログインしてから以下のコマンドで再生成します。 recreate.sh EDITOR=vim rails credentials:edit 場合によってはsudoをつけたほうが良いかもしれません。 そもそもmaster.key、credentials.yml.encとは? いわゆるサーバで設定する環境変数をrails内で設定できるという仕組みで master.key(秘密鍵)、credentials.yml.enc(公開鍵)といった具合に 1組の対になっています。 ですから何らかの拍子で一つが変わったりする場合エラーになります。 またmaster.keyは必ず.gitignoreなどに記載し、公開されないように デプロイツールに登録しなければなりません。 番外編|コンテナが立ち上がらない railsのWebサーバが立ち上がっていない状態です。 docker.sh $ docker compose up -d $ docker container ls cfxxxxxxa776 mysql:5.7 "docker-entrypoint.s…" 1 minutes ago Up 1 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp webapp-db-1 対応方法 /tmp/pids/server.pid というファイルを削除しコンテナを再度立ち上げると無事ウェブサーバが立ち上がりました。 これはrails特有のお作法でよくある原因とのことでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

{Rails}ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)が出た場合の対処法

①やりたいこと MySQLにログインしたい。 Modelを作成し、rails db:migrateを実行した後の出来事でした。(この2つは問題なく実行できました) ②エラー内容 % sudo mysql -u root Password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) ちなみにsudo mysql -u rootと打つとEnter password:と出てくるので、パスワードを打った後に出てきたのがこのエラー文です。 ③原因 ④解決策 下記の記事を参考にしました。 https://ja.getdocs.org/mysql-error-1-45-28-access-denied-for-user-rootlocalhost-using-password-no/ 引用すると >ユーザ ‘root’は、MySQLサーバにログインするためのパスワードが必要です。 ** これを解決するには、MySQLサーバーに接続する際にパスワードに -pフラグを付けてください。 とのことなのでmysql -u root -pでもう一度実行したら、無事ログインできました。(sudo mysql -u root -pでもできますが、パスワードを2回打つことになるのでsudoはなくてもいいです。) あとがき:-p(password?)を付けるのと付けないのでは何が違うのか、わかる方いればご教授いただきたいです。 開発環境 mac OS バージョン11.6 Rails 6.1.4.4 Ruby 3.0.3 MYSQL 0.5 エディタ VScode
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

{VScode} 「Implicit keys needs to be on a single line」と出た場合

VScodeでdatabase.ymlをいじっていると、下の「問題」となっているところに「Implicit keys needs to be on a single line」と出ました。 何やら問題が発生しているらしく、その対象の文が赤線で引かれています。(画像) https://gyazo.com/e934bd8d247577458c145c7bf9b64fb1 よくわからなかったので、この状態のままrails sコマンドでページを開こうとしました。すると、、 https://gyazo.com/b6efd3ee3abadd7aa9435a93c209e2a9 何やらエラーが出て、ページが表示されません。 Please note that YAML must be consistently indented using spaces. Tabs are not allowed. ↑ Google先生に和訳してもらうと、「YAMLはスペースを使用して一貫してインデントする必要があることに注意してください。 タブは許可されていません。」とのこと。 非常に単純な問題でしたが、単純ゆえにハマるとなかなかわからなかったりするんですよね〜。 https://gyazo.com/409e56275d445c48216d8630e4183d89 言われたとおりインデントして、再度試したらちゃんと開けました! 開発環境 mac OS バージョン11.6
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでCSVファイルを読み込み、DBに住所データを一括登録

はじめに 実務で表題の通り、郵便データをCSVファイルから読み取り、住所データをDBに一括登録する場面があったので、その方法をご紹介致します。 今回は下記リンクから飛べる、読み仮名データの促音・拗音を小書きで表記するものの中にあるken_all.zipという全国一括版のファイルをダウンロードしました 環境 Laravel 8.* MySQL5.7 データをダウンロードする 全国一括(KEN_ALL.CSV)というファイルをZIPファイルを展開する。 展開したファイルを laravelプロジェクトディレクトリ/storage/app/csv直下に配置し、Laravelからファイルを読み込むようにする。 住所データを保存するテーブルを作成 下記コマンドを実行して、住所データを格納する為のマイグレーションファイルと、モデルを同時に作成 php artisan make:model PostalCode -m database/migrations内にxxxx_xx_xx_xxxxxx_create_postal_codes_table.phpというファイルができているので、up()の中身を下記のように変更してphp aritsan migrateを実行する。 public function up() { Schema::create('postal_codes', function (Blueprint $table) { $table->increments('id');//オートインクリメントで連番 $table->unsignedInteger('first_code')->index();//郵便番号の始め(3桁)の部分 $table->unsignedInteger('last_code')->index();//郵便番号の後ろ(4桁)の部分 $table->string('prefecture');//都道府県名 $table->string('city');//市区町村 $table->string('address');//それ移行の住所 }); } 先程作成したモデルは下記のように変更 namespace App; use Illuminate\Database\Eloquent\Model; class PostalCode extends Model { public $timestamps = false;//マスタデータとして使用するので不要とのことだったので、timestampsをfalseに指定。 protected $guarded = ['id'];//データ追加時に思わぬエラーが起きないようidを指定 } ここまでの手順で、住所データをDBに登録する為の土台が出来上がりました。 (住所登録用のテーブルとモデルが完成) CSVファイルから郵便データを読み取り、DBへ一括登録 日本郵便のデータは頻繁に更新されているようなので、その都度更新が出来るよう郵便データ登録用のコマンドを作成します。 php artisan make:command ImportPostalCodeCommand 次に、app/Console/Commands/ImportPostalCodeCommand.phpを開いて、中身を下記のように変更します。 <?php namespace App\Console\Commands; use Illuminate\Console\Command; class ImportPostalCodeCommand extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'import:postal-code';//コマンド実行名 /** * The console command description. * * @var string */ protected $description = 'Import postal-code';//コマンドの説明内容 /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { // 登録処理の前にテーブルを一旦、空にする \App\PostalCode::truncate(); // CSVファイルの文字コード変換 $csv_path = storage_path('app/csv/KEN_ALL.CSV');//先程ダウンロードしたCSVファイルのパスを書く $converted_csv_path = storage_path('app/csv/postal_code_utf8.csv');//CSVファイルの文字コードをSJIS-winからUTF-8に変換した後のファイル名を指定 file_put_contents( $converted_csv_path, mb_convert_encoding( file_get_contents($csv_path), 'UTF-8', 'SJIS-win' ) ); // 文字コードを変換したCSVファイルから郵便データを取得してDBへ保存 $file = new \SplFileObject($converted_csv_path); $file->setFlags(\SplFileObject::READ_CSV); foreach ($file as $row) { if (!is_null($row[0])) { //空行の場合、登録処理の際にエラーが発生することがあるので条件分岐させる \App\PostalCode::create([ 'first_code' => intval(substr($row[2], 0, 3)), 'last_code' => intval(substr($row[2], 3, 4)), 'prefecture' => $row[6], 'city' => $row[7], 'address' => (str_contains($row[8], '(')) ? current(explode('(', $row[8])) : $row[8] ]); } } } } php artisan import:postal-codeを実行して郵便データを移動させます。(全12万件と、データ量がとても大きいので、登録処理に少し時間がかかるのと、大規模のデータを登録するのでテーブルの削除処理から登録までにトランザクションを張った方が良いかと思います。(下記のような形で) 以上で、郵便データの登録処理が完了致しました。作業に取りかかるまでは難しそうなイメージでしたが、いざ終わってみると意外と簡単という感想です。 今回は実務として着手することはなかったのですが、個人で住所検索処理の実装などもやってみます。 ここまで読んで頂きありがとうございます。今後ともメモ代わりに書いていけたらと思っておりますので宜しくお願い致します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

簡単!!WSL2とDockerでデータベース環境構築

開発環境を構築する中でデータベースは必ずと言ってもいいくらい必要になります。 WSL2のディストリビューションにDockerを入れると とても簡単に短時間で安定したデータベース利用環境を構築することができたので、 今回は以前投稿したWSL2を利用したLinux開発環境にDockerをインストールして データベースの環境を構築した際の手順をご紹介いたします。 構築するデータベースとしてはRDBの例としてMySQL、NoSQLの例としてRedisを構築していきます。 MySQL Redis 前提条件 以下の記事に従ってWSL2を利用したLinux開発環境の環境が構築されていること。 実施環境 OS:Windows 10 Home バージョン 21H1 ディストリビューション:Ubuntu 20.04 LTS (推奨)作業用ターミナルとしてはWindowsターミナルの使用をお勧めします。 Dockerのインストール Dockerのインストール手順についてはdocker docsに手順が記載されているので、 基本的にはdocsの手順に従いインストールを進めていきます。 Docker Engine インストール リポジトリのセットアップ 1. aptパッケージの更新 sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release 2. GPG 鍵の追加 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 3. 安定版(stable)リポジトリのセットアップ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null インストール 1. aptパッケージの更新 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io Linux インストール後の作業 Docker管理のユーザ追加 ログインユーザにdockerコマンドの実行権限を付与してsodo無しでコマンド実行できるようにします。 1. dockerグループの作成 sudo groupadd docker 2. グループへのユーザ追加 sudo gpasswd -a $USER docker ※ docker docsではusermodコマンドを利用してグループ追加を行っていますが、破壊的なコマンドのため、ここではgpasswdコマンドを利用してユーザ追加を行います。 Docker自動起動設定 WSLを起動するたびにDockerを起動するのはとても煩わしいので自動起動設定を行います serviceコマンドのsudo権限追加 visudoを使いsudoersファイルを更新してログインユーザにsudo権限を追加します。 1. visodo起動 sudo visudo 2. Dockerデーモン起動設定追記 最後の行に以下の設定を追加します。 ※ XXXXXX部はユーザ名に置き換える XXXXXX ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service docker start 入力例 3. 保存 3.1. 編集終了 メニューに従い次のコマンドを入力して編集を終了します。 [Ctrl] + [X] 表示メニュー 3.2. 確認 メニューに従い次のコマンドを入力して設定を保存します。 [Y] 表示メニュー 3.3. 終了 ファイル名はそのままに次のコマンドを入力して保存します。 [Enter] 表示メニュー Dockerデーモン起動設定 .bashrcの最後の行に以下の設定を追加します。 .bashrcの編集 vi .bashrc 設定 if [ $(service docker status | awk '{print $4}') = "not" ]; then sudo service docker start > /dev/null fi 設定反映 コマンドプロンプトを起動して次のコマンドを入力してwslをシャットダウンします。 wsl --shutdown 再度wslにログインすることでDockerデーモンが自動で起動しsudo無しでdockerコマンドが実行可能となります。 Dockerイメージの取得 Dockerイメージを取得してデータベース環境を構築していきます。 以下の手順ではイメージはDocker Hubより取得します。 Docker Hubにはイメージ取得(Pull)の回数制限があるため、 同一IPアドレス環境内でイメージ取得が頻繁に行われている場合、 上限に達している可能性があります。 その際にはDocker Hubに登録したユーザーでログインした上で実施する必要があります。 (無料ユーザでも可) Redis環境構築 イメージ取得 次のコマンドを実行してRedisのイメージを取得します。 docker pull redis イメージ起動 次のコマンドを実行してRedisのイメージを起動します。 docker run -it --name redis -d -p 6379:6379 redis:latest コンテナ自動起動設定 次のコマンドを実行することでWSLを再起動した際にコンテナが自動で起動します。 docker update --restart=always redis Redisコマンドラインインタフェースインストール Redisのコマンドラインインタフェースであるredis-cliをインストールします。 redis-cliインストール 次のコマンドを実行してredis-cliをインストールします。 sudo apt install redis-server 接続確認 次のコマンドを実行して接続を確認します。 redis-cli 127.0.0.1:6379に接続され対話モードでCLI実行可能となれば構築完了です。 MySQL環境構築 イメージ取得 次のコマンドを実行してMySQLのイメージを取得します。 docker pull mysql イメージ起動 次のコマンドを実行してMySQLのイメージを起動します。 docker run -it --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql:latest コンテナ自動起動設定 次のコマンドを実行することでWSLを再起動した際にコンテナが自動で起動します。 docker update --restart=always mysql MySQLクライアントインストール MySQLのクライアントをインストールします。 コマンド確認 次のコマンドを実行することでMySQLクライアントのインストールを促されます。 mysql ※ 2022年2月時点では次のコマンドが表示されます。 sudo apt install mysql-client-core-8.0 # version 8.0.27-0ubuntu0.20.04.1, or sudo apt install mariadb-client-core-10.3 # version 1:10.3.32-0ubuntu0.20.04.1 インストール 次のコマンドを実行してMySQLクライアントをインストールします。 sudo apt install mysql-client-core-8.0 接続確認 次のコマンドを実行して接続を確認します。 mysql -u root -p -h 0.0.0.0 -P 3306 接続に成功し対話モードでCLI実行可能となれば構築完了です。 参考 docker docs Docker Engine インストール(Ubuntu 向け) Linux インストール後の作業 ダウンロードレート制限 コンテナーの自動起動 docker hub redis mysql
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MySQL】MySQLを完全にアンインストールする方法

はじめに  本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。  そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。  間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。 MySQLを完全にアンインストールする方法 環境 OS: MacOS Big Sur 11.6.1(M1 mac) Ruby: 2.7.5 MySQL: 5.7(8.0でも確認しました。) 手順 以下の手順でMySQL関連のデータを全て削除することができます。 sudo rm -rf /usr/local/Cellar/mysql* sudo rm -rf /usr/local/bin/mysql* sudo rm -rf /usr/local/var/mysql* sudo rm -rf /usr/local/etc/my.cnf sudo rm -rf /usr/local/share/mysql* sudo rm -rf /usr/local/opt/mysql* sudo rm -rf /etc/my.cnf sudo rm -rf /opt/homebrew/var/mysql rm -rf ~/Library/PreferencePanes/My* sudo rm /usr/local/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /Library/StartupItems/MySQLCOM sudo rm -rf /Library/PreferencePanes/My* sudo rm -rf /Library/Receipts/mysql* sudo rm -rf /Library/Receipts/MySQL* sudo rm -rf /private/var/db/receipts/*mysql* sudo rm /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist brew uninstall mysql
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む