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

DockerでWordPressなうに使っていいよ。

DockerのWordPressイメージを公開します。 もし有用なら、GitHub や Docker hub で星を付けて頂けると励みになります。 https://github.com/takeyamajp/docker-wordpress このDockerイメージを使って、いつでも完成度の高いWordPress環境を気軽に作り出す事ができます。 サイト構築やプラグインのテスト環境として最適です。 また、個人レベルの小規模サイトであれば実運用にも耐えられます。 関連するDockerイメージとして、データベース用のMySQL, MariaDB, phpMyAdminなどのイメージも公開しています。 https://github.com/takeyamajp/docker-mysql https://github.com/takeyamajp/docker-mariadb https://github.com/takeyamajp/docker-phpmyadmin また、WordPressで使用する送信専用メールサーバーには以下のDockerイメージがお勧めです。 https://github.com/takeyamajp/docker-postfix https://qiita.com/takeyamajp/items/be4ccc61862de3b121bf 概要 このDockerイメージには、以下のような特徴があります。 ・タイムゾーンを設定する事ができる。 ・httpをhttpsに自動リダイレクトさせる事ができる。 ・GZIP圧縮をサポートしている。 ・BASIC認証をサポートしている。 ・WordPressの基本設定を、このDockerイメージの変数から行う事ができる。 ・php-fpmで動作する。 FROM centos:centos8 ... ENV TIMEZONE Asia/Tokyo ENV FORCE_SSL true ENV GZIP_COMPRESSION true ENV BASIC_AUTH false ENV BASIC_AUTH_USER user ENV BASIC_AUTH_PASSWORD password ENV HTTPD_SERVER_ADMIN root@localhost ENV HTTPD_LOG true ENV HTTPD_LOG_LEVEL warn ENV HTTPD_PHP_ERROR_LOG true ENV WORDPRESS_DB_HOST mysql ENV WORDPRESS_DB_NAME db ENV WORDPRESS_DB_USER user ENV WORDPRESS_DB_PASSWORD password ENV WORDPRESS_TABLE_PREFIX wp_ ENV WORDPRESS_DEBUG false ENV WORDPRESS_CONFIG_EXTRA param1,param2 ENV WORDPRESS_CONFIG_EXTRA_VALUE \'string\',true VOLUME /wordpress EXPOSE 80 EXPOSE 443 実行方法 最もシンプルな実行方法を紹介します。 以下のymlファイルを作成してDocker-Composeで実行してください。 (takeyamajp/mysqlの部分は、takeyamajp/mariadbに置き換えることができます。) その後、任意のブラウザーからhttp://localhost:8080/、もしくはhttp://サーバーのIPアドレス:8080/にアクセスしてください。 (MySQLやMariaDBの初期化処理に数十秒~数分間待つ必要があります。) docker-compose.yml version: '3.1' services: wordpress: image: takeyamajp/wordpress ports: - "8080:80" environment: FORCE_SSL: "false" mysql: image: takeyamajp/mysql 各種設定 タイムゾーン(TIMEZONE) サイトで扱われる日時のタイムゾーン設定です。 Linuxで設定可能なタイムゾーンをそのまま設定する事ができます。 日本国内で使用する場合は、設定を変更する必要はありません。 SSL通信の強制(FORCE_SSL) httpでアクセスした場合に、自動的にhttpsにリダイレクトする設定です。 簡易のテスト環境を用意する場合など、このDockerイメージを単体で動作させるときは、上記のdocker-compose.ymlファイルのようにfalseに設定してください。 リバースプロキシのバックエンドとして動作させる場合はtrueに設定してください。 (リバースプロキシとhttps通信するためにイメージ内に自己署名のSSL証明書を自動作成します。) GZIP圧縮(GZIP_COMPRESSION) サイトの表示速度を向上させるために、GZIP圧縮を有効にする設定です。 通常は設定を変更する必要はありません。 BASIC認証(BASIC_AUTH) 一部の人だけがサイトにアクセスできるようにBASIC認証をかける事ができます。 前述のFORCE_SSLがtrueになっている場合は、先にhttpsにリダイレクトされた後にBASIC認証が要求されるため、ネット上で認証情報を平文でやりとりする事はありません。 サーバーの管理者情報(HTTPD_SERVER_ADMIN) サーバー上でエラーが発生した場合に、エラーページに表示する問い合わせ先情報です。 本番運用する場合は、連絡先のメールアドレスを設定してください。 https://httpd.apache.org/docs/2.4/ja/mod/core.html#serveradmin サーバーのログ出力 このDockerイメージで出力されるログは、すべてDocker logsに出力します。 次のコマンドdocker logs -f wordpressを実行すると、出力されるログをリアルタイムで確認する事ができます。 HTTPD_LOG WEBサーバーのログ出力をするかどうかの設定です。 通常は変更する必要はありません。 出力内容を増減させたい場合は、後述するHTTPD_LOG_LEVELを変更してください。 HTTPD_LOG_LEVEL WEBサーバーのログ出力レベルを8段階で設定します。 通常は変更する必要はありません。 https://httpd.apache.org/docs/2.4/ja/mod/core.html#loglevel HTTPD_PHP_ERROR_LOG PHPプログラムでエラーが発生した場合にログ出力するかどうかの設定です。 WordPress、プラグインなどでエラーが発生した場合にログが出力されます。 通常は変更する必要はありません。 WordPressのデータベース設定 ここで事前にデータベース設定をしておけば、初回起動時にデータベースの接続情報を手入力する必要はありません。 WORDPRESS_DB_HOST データベースのホスト名(Dockerのコンテナ名)を設定します。 WORDPRESS_DB_NAME データベース名を設定します。 データベースのコンテナと設定を合わせる必要があります。 WORDPRESS_DB_USER データベースのユーザー名を設定します。 データベースのコンテナと設定を合わせる必要があります。 WORDPRESS_DB_PASSWORD データベースユーザーのパスワードを設定します。 データベースのコンテナと設定を合わせる必要があります。 WORDPRESS_TABLE_PREFIX データベースのテーブル名で使用される接頭辞です。 通常は設定を変更する必要はありません。 1つのデータベースに2つ以上のWordPressデータを保存するときに、WordPressのコンテナ毎に設定を変えてください。 WordPressの追加設定 wp-config.phpに自動追加される設定です。 多くの場合、手動でWordPressの設定ファイルを編集する必要は無いでしょう。 例えば、サンプルとして用意されているデフォルト設定では、wp-config.phpの先頭に以下の行が自動追加されます。 // BEGIN CONFIG EXTRA define('param1', 'string'); define('param2', true); // END CONFIG EXTRA WORDPRESS_CONFIG_EXTRA カンマ区切りでパラメータ名を設定します。 WORDPRESS_CONFIG_EXTRA_VALUE カンマ区切りでパラメータの値を設定します。 文字列を設定する場合は、カンマ文字をエスケープしてください。 WordPressのデータを永続化する。 必要に応じて、任意のディレクトリをボリューム/wordpressにマウントしてください。 新規の環境を構築する場合は、空ディレクトリをマウントしてください。 既存のWordPressディレクトリをマウントする事で、他の環境からファイルデータを引き継ぐ事ができます。 WordPressのデバッグ設定 WORDPRESS_DEBUG WordPress自体のデバッグを行う場合にtrueに設定してください。 通常は使用しません。 — 以上です。 それでは良いWordPressライフを。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLでランダムデータを作成する

日付 select date(now() - interval 1 day) + interval floor(rand() * 86400) second; 実行時刻の1日前の00:00:00から、その日内の時刻でランダムな日時を決める。 mysql> select date(now() - interval 1 day) + interval floor(rand() * 86400) second; +----------------------------------------------------------------------+ | date(now() - interval 1 day) + interval floor(rand() * 86400) second | +----------------------------------------------------------------------+ | 2021-04-17 01:32:41 | +----------------------------------------------------------------------+ 1 row in set (0.01 sec) 文字列 substring(md5(rand()), 1, 19) ランダムで生成したmd5の文字列から、所定の長さを使う。 mysql> select substring(md5(rand()), 1, 19); +-------------------------------+ | substring(md5(rand()), 1, 19) | +-------------------------------+ | 08384853ae61dc665e5 | +-------------------------------+ 1 row in set (0.00 sec) 参考 MySQLで簡単にランダムなテストデータを作成する方法 - Qiita RAND(), RAND(N)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

COUNT(DISTINCT)

COUNT(DISTINCT) COUNT 関数に DISTINCT を使うことで、重複を排除したカウント MySQL Reference Problem 1693.Daily Leads and Partners 難易度:Easy LeetCode Link My Code SELECT date_id, make_name, COUNT(DISTINCT lead_id) AS unique_leads, COUNT(DISTINCT partner_id) AS unique_partners FROM DailySales GROUP BY date_id, make_name ;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HomebrewによるMySQLのpostinstall&mysql.server startが出来なくて苦労した件

HomebrewでMySQLをinstallしたらwarningが出てその後のmysql.server startも出来なかった件 解決するのに2週間かかりました。ので、記録します。 前置き ※今回のエラーは後述します。 おそらく、MySQLのエラーでmysql.server startを実行して ERROR! The server quit without updating PID file (/usr/local/var/mysql/ユーザー名.pid). のエラーが出ることが多いかと思います。 で、この内容に関する記事もネット上に山ほどあって ・mysqlの再インストール ・pathの見直し ・Homebrew自体をbrewdoctorして問題を解消 ・my.cnfファイルの内容の見直し ・パーミッションの確認 etc...沢山試しましたが私の場合解決しませんでした。 今回のエラー The post-install step did not complete successfully …よく見るとinstallの時点でwarningが出ていた。 それがこちら Warning: The post-install step did not complete successfully You can try again using: brew postinstall mysql 訳するとインストール後のステップがちゃんと行われませんデシタ 的な? とりあえず指示通り brew postinstall mysqlをしてみたが、症状変わらず…。 postinstallは/usr/local/var/mysqlディレクトリを作成してデータベースを作成するはずらしいのですが、 私の場合mysqlディレクトリすら存在しませんでした。 なにかPATHがおかしいのかな? でも、MySQLのPATHは.zshrcに記載したハズだし…。 と途方にくれていました。 解決 .bash_profileに(多分過去に自分で設定してた)PATHがあるのを発見して削除したら上手く行った .bash_profile にMySQLに関するPATHが3つほどありました。そりゃ、インストールうまくいきませんよね。 削除したらWarninguも消えてMySQLもstartできました!! ※PATHの削除の仕方が分からない方へ 普通にファイルをテキストエディタで開くか、viコマンドで編集出来ます。 viコマンドは難しいので「vi 使い方」などでググると方法がでてきます。 https://prev.net-newbie.com/linux/commands/vi.html PATHもしっかり通し直す必要があるので「XXX のPATH 通し方」等々で調べれば出るかと思います。 経緯  色々試していくうちにPostgreSQLもreinstallしてみたら同様のWarningが発生したので https://qiita.com/ipepi/items/58dedbc0434fa9ea3b71 を参考に再設定していたら、.bash_profileの設定時に…「あれ?ここにMySQLのPATH通したっけ?」となり 削除したら無事warningも消えmysqlにログインできました? MySQLのPATHの事は.zshrcにだけ焦点が向いており焦点でした。 原因は2.3ヶ月前のなにも分からない時にMySQLとPostgreSQLのインストールを行っており その際に何個もPATHを通したままにしてしまった事かと思います。 いやぁ、本当に未熟でした。反省 結論 PATHもちゃんと見直そう 2箇所あるかも?  PATHは記事や教材によって .zshrc と .bash_profile に通す場合と分かれているので 両者注意していきたいですね。 下記記事参考になります https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def  
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL操作で使う基本コマンド

MySQLの基本コマンド rootユーザーでのログイン 下記コマンド入力後にパスワード入力を求められるため、入力しEnter ※ただしパスワードは入力しても文字数すら表示されないため、気をつけて入力する rootユーザーでのログイン(パスワード有) mysql -u root -p ログアウト ログアウト exit データベースに対する操作 データベース一覧表示 データベース一覧表示 show databases; データベースの作成 「testdb」というデータベース名のデータベースを作成する データベースの作成 create database testdb; 作成されたかどうかの確認は「データベース一覧表示」コマンド 使用するデータベースを選択する 「testdb」というデーターベースを使用する 使用するデータベースを選択する use testdb; テーブルに対する操作 テーブル一覧表示 デフォルトで作成されているテーブルは存在しないため、0件表示になる ※エラーにはならない テーブル一覧表示 show tables; テーブルの作成 「testtb」というテーブルを作成する。 テーブルには数字型の「id」と文字列型の「name」という列(カラム)を持たせる。 数字型は特殊な使い方をしない場合は、int型を使用する。 文字列型はvarchar型とchar型の2種類があるが、char型の場合は文字数が固定となり、追加した値の文字数が少ない場合には空白で文字うめをした状態でデータが格納される。使用用途によって使い分ける。また、varchar型の後ろの数字はバイト数を表す、日本語の場合は1文字あたり3byteになるため、その点を考慮して余裕を持たせて設定する。 「not null」を設定し、「name」と「subtesttb_id」を必須項目に設定。   ※主キーの「id」はprimary keyに設定した時点で「必須項目」となっているため設定不要 idを主キーを設定。subtesttb_idを外部キーに設定(参照先はsubtesttbテーブルのid列)。   ※subtesttbテーブルを作成してから実行しないと、エラーになります。 テーブルの作成 create table testtb( id int primary key, name varchar(40) not null, subtesttb_id int not null, foreign key (subtesttb_id) references subtesttb (id) ); 作成されたかどうかの確認は、「テーブル一覧表示」コマンド テーブル設定情報の確認 testtbテーブルの設定情報を見ることができます。 テーブルの設定情報の確認 show columns from testtb; テーブル内の要素に対する操作 テーブル内のデータ一覧表示 testtbテーブル内のデーター一覧表示をします。 テーブル内の要素の取得 select * from testtb; テーブルに要素を追加 testtbテーブルに下記要素を追加します id:1 name:taro subtesttb_id:1 テーブルに要素の追加 insert into testtb( id, name, subtesttb_id ) values ( 1, 'taro', 1 ); 追加できたかどうかの確認は「テーブル内のデータ一覧表示」コマンド テーブル内の要素の更新 testtbテーブルの下記要素を更新します。 ※要素をwhereで指定しない場合、テーブル内の全件更新になるので注意 id:1 name:taro→jiro subtesttb_id:1 テーブル内の要素の更新 update testtb set name = 'jiro' where id = 1; 更新できたかどうかの確認は「テーブル内のデータ一覧表示」コマンド テーブル内の要素の削除 testtbテーブルの下記要素を削除します。 ※要素をwhereで指定しない場合、テーブル内の全件削除になるので注意 id:1 name:jiro subtesttb_id:1 テーブル内の要素の削除 delete from testtb where id = 1; 削除できたかどうかの確認は「テーブル内のデータ一覧表示」コマンド
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベース一覧表示(Java,MySQL)

データベースに登録したデータを一覧表示させる方法について、 気づいた事も含め、下記にまとめました。 環境 Java version 1.8.0_231 MySQL 8.0 Tomcat 9.0 Eclipse 実装 下記に簡単なプログラムを作成し、実装してみました。 テーブル構成 mysql> select * from nakamura; +----------+ | name | +----------+ | 中村倫也 | | 中村アン | | 中村俊輔 | | 中村獅童 | +----------+ DAO NakamuraDAO.java package nakamura; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class NakamuraDAO{ private static final String url = "jdbc:mysql://localhost/qiita?serverTimezone=JST"; //URL private static final String user = "root"; //DBユーザー private static final String pass = "pw"; //DBパスワード/ private List<Nakamura> nlist = new ArrayList<>(); //リストに格納 //データベース一覧表示メソッド public List<Nakamura> showAllList() { //JDBC読み込み try (Connection con = DriverManager.getConnection(url,user,pass)){ //データベースから氏名を取得するSQL文 String sql ="select name from nakamura"; PreparedStatement ps = con.prepareStatement(sql); //SQL文の実行 ResultSet rs = ps.executeQuery(); if(rs.next()){ //データベースから取得した値をセット Nakamura nakamura = new Nakamura(); //氏名の取得 nakamura.setName(rs.getString("name")); nlist.add(nakamura); } rs.close(); ps.close(); }catch(SQLException e) { e.printStackTrace(); } return nlist; } } DTO Nakamura.java package nakamura; import java.io.Serializable; public class Nakamura implements Serializable { private static final long serialVersionUID = 1L; private String name; //氏名 //コンストラクタ public Nakamura(){} //氏名 public String getName(){ return name; } public void setName(String name){ this.name = name; } } Servlet servlet.java package nakamura; import java.io.IOException; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; //登録データを一覧表示するクラス @WebServlet("/NakamuraListDisplay") public class NakamuraListDisplay extends HttpServlet{ private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //データベース一覧表示 NakamuraDAO nd = new NakamuraDAO(); List<Nakamura> nlist = nd.showAllList(); //セッションの開始 HttpSession session = request.getSession(); //セッションスコープにデータ登録 session.setAttribute("nlist",nlist); RequestDispatcher rd = request.getRequestDispatcher("nakamura_list.jsp"); rd.forward(request, response); } } JSP jsp.java <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="nakamura.Nakamura" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List"%> <% //セッションスコープに保存されたデータを取得 List<Nakamura> nlist = (List<Nakamura>)session.getAttribute("nlist"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>DB登録一覧</title> </head> <body> <table> <%for(int i = 0; i < nlist.size(); i++){%> <%Nakamura nakamura = (Nakamura)nlist.get(i);%> <tr> <td><%=nakamura.getName()%></td> </tr> <% } %> </table> </body> </html> webアプリーケーションの実行。 ブラウザを見てみると、、、 ??? 一件のみしか取得できていなかった、、、。 何故なのか? 色々と調べてみた結果、 NakamuraDAO.java if(rs.next()){ DAOクラスのこの行が原因でした。 データを1行のみしか取得していないため、データが複数あったとしても最初の一行のみしか取得しない。 if文とwhile文の使い分け if文 if( 条件式 ){  処理内容 } 条件式がtrueの場合、処理内容を実施。 主キーで取得するようなSQLであれば、1件しかデータを取得しないため、if文を使用。 while文 while (条件式) { 処理内容 } 条件式がtrueである間、処理内容を繰り返し実施する。 複数のデータを取得する場合は、while文を使用。 以上を踏まえ、 while文に修正、Webアプリケーションの実行。 ブラウザを見てみると、、、 データベースの全件取得、一覧表示することができました。 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerでmysqlを立ち上げ、外部から接続できるようにする

開発PCにmysqlをインストールをしていなかったのですが、dbを使った技術検証をするのに不便だったので、dockerでmysqlコンテナを立てることにしてみました。 ディレクトリ構成は下記になります。 // ディレクトリ構造 ─db └─conf └─mysqld.conf.d my.cnf mysqlの設定として、簡単に以下のファイルを用意しました。 my.cnf [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] character-set-server=utf8mb4 explicit_defaults_for_timestamp=on 下記のコマンドでdockerコンテナ立ち上げます。 docker run -v ${pwd}/db/conf/mysqld.conf.d:/etc/mysql/conf.d --name mysql -e MYSQL_ROOT_PASSWORD=root -e BIND-ADDRESS=0.0.0.0 -p 3306:3306 -d mysql:5.7 コンテナの状況を確認すると、ちゃんと起動できていることが確認できました。 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0580fa7597c2 mysql:5.7 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql この状況であれば、ホスト側のPCからlocalhostのポート:3306でmysqlに接続することができます。今回はホスト側にmysqlクライアントがインストールされていないので、dockerコンテナを用意してこのコンテナ内から先ほど立ち上げたmysqlコンテナに接続してみます。 > docker run -it --rm mysql:5.7 /bin/bash root@e24782850c58:/# mysql -u root -p -h host.docker.internal Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 Server version: 5.7.33 MySQL Community Server (GPL) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 無事に接続することができました。設定が反映されているかも確認してみます。 mysql> show global variables like 'explicit_defaults_for_timestamp'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | explicit_defaults_for_timestamp | ON | +---------------------------------+-------+ 1 row in set (0.00 sec) mysql> SHOW VARIABLES LIKE "char%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec) mysql> 設定ファイルも無事に反映されていることが確認できました。 ちなみに今回立ち上げたmysqlコンテナはデータを永続化させる設定ではないので、コンテナを削除したらデータが消えてしまうので注意してください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む