20200923のMySQLに関する記事は8件です。

【MySQL】試しにデータベースを作って色々いじってみた。

なんで書いたの?

MySQLについて学習した内容をアウトプットする目的で、適当なデータベースを作って(DBeaverなどは使わず)ターミナル上でコマンド操作して色々いじってみました。

※見て頂くと検討つくと思うのですが、私は乃木坂46・日向坂46のファンです。が、ここで作ったものは架空のものですので、その点お含み置きください。

目次

  1. AWSのRDSでMySQLサーバーを立ち上げる
  2. AWS公式ドキュメントを元に、RDSで起動中のMySQLサーバーに管理者としてログイン
  3. 下記内容をいじってみる

<具体的には>

  • DBの作成
  • DBの表示
  • 使用するデータベースを選択
  • テーブルの作成
  • テーブルへレコードを挿入
  • テーブルを表示
  • テーブル名/インデックス名/カラム名を追加・変更
  • 新しいカラムを追加した後に、追加したカラムを消去する
  • 真偽値と登録日時をカラムとして追加してみる
  • 後から主キー(Primary-key)を設定する
  • AUTO_INCREMENTを追加する

1. AWSのRDSでMySQLサーバーを立ち上げる

やったことはざっと下記の通り。

  • 無料枠でMySQLのDBを作成
  • マスタユーザー(=管理者)の認証情報を入力(ユーザー名とパスワード)
  • どのVPC(仮想ネットワーク)でRDSを実行させるか設定
  • セキュリティグループで、「インバウンドのルールの編集」で、タイプ -> MySQL/Aurora、プロトコル -> TCP、ポート範囲 -> 3306、ソース -> 任意の場所,0.0.0.0/0, ::/0で設定(学習用のため任意の場所で設定)

2. AWS公式ドキュメントを元に、RDSで起動中のMySQLサーバーに管理者としてログイン

公式ドキュメントの「MySQL クライアントからの接続」を参照し、適切なエンドポイントと、MySQLマスタユーザー(=管理者)でコマンド操作

mysql -h <endpoint> -P 3306 -u <mymasteruser> -p

すると、パスワードが求められるので、入力しログイン成功!

USER:~ user$ mysql -h ****.rds.amazonaws.com -P 3306 -u admin -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 29
Server version: 8.0.20 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

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>

3.下記のコマンドを試しにやってみる

DBの作成

mysql> CREATE DATABASE HINATAZAKA_DB;
Query OK, 1 row affected (0.06 sec)

DBの表示

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| HINATAZAKA_DB      |
| NOGIZAKA_DB        |
| information_schema |
| mysql              |
| performance_schema |
| testdb             |
+--------------------+
6 rows in set (0.05 sec)

使用するデータベースを選択

※この操作を入れないと、テーブル・カラムを操作する時にDBの名前.処理内容といちいち書かないといけないのは面倒だと思い、調べてやってみた。

mysql> USE NOGIZAKA_DB;
Database changed
mysql> USE testdb ;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

テーブルの作成

mysql> CREATE TABLE blogs ( id int, name varchar(10));
Query OK, 0 rows affected (0.07 sec)

テーブルへレコードを挿入

mysql> INSERT INTO blogs (id ,name) VALUES
    -> (1,"KAKI"),
    -> (2,"ASYU"),
    -> (3,"MATYU");
Query OK, 3 rows affected (0.06 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM blogs;
+------+-------+
| id   | name  |
+------+-------+
|    1 | KAKI  |
|    2 | ASYU  |
|    3 | MATYU |
+------+-------+
3 rows in set (0.06 sec)

テーブルを表示

mysql> SHOW columns FROM blogs;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int         | YES  |     | NULL    |       |
| name    | varchar(10) | YES  |     | NULL    |       |
| watcher | int         | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

テーブル名/インデックス名/カラム名を追加・変更

mysql> ALTER TABLE blogs ADD watcher int;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int         | YES  |     | NULL    |       |
| name    | varchar(10) | YES  |     | NULL    |       |
| watcher | int         | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.05 sec)

新しいカラムを追加した後に、追加したカラムを消去する

mysql> ALTER TABLE blogs ADD comments varchar(10);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| watcher  | int         | YES  |     | NULL    |       |
| comments | varchar(10) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.05 sec)

mysql> ALTER TABLE blogs drop comments;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int         | YES  |     | NULL    |       |
| name    | varchar(10) | YES  |     | NULL    |       |
| watcher | int         | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.05 sec)

真偽値と登録日時をカラムとして追加してみる

mysql> ALTER TABLE blogs ADD is_draft BOOL;
Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE blogs ADD created DATETIME;
Query OK, 0 rows affected (1.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | YES  |     | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| watcher  | int         | YES  |     | NULL    |       |
| is_draft | tinyint(1)  | YES  |     | NULL    |       |
| created  | datetime    | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.04 sec)

mysql> INSERT INTO blogs (id,name,watcher,is_draft,created) VALUES (5,"YUTTAN",40,TRUE,2020-10-10);
Query OK, 1 row affected, 1 warning (0.05 sec)

mysql> SELECT * FROM blogs;
+----+--------+---------+----------+---------------------+
| id | name   | watcher | is_draft | created             |
+----+--------+---------+----------+---------------------+
|  1 | KAKI   |    NULL |     NULL | NULL                |
|  2 | ASYU   |    NULL |     NULL | NULL                |
|  3 | MATYU  |    NULL |     NULL | NULL                |
|  5 | YUTTAN |      40 |        1 | 0000-00-00 00:00:00 |
+----+--------+---------+----------+---------------------+
4 rows in set (0.04 sec)

後から主キー(Primary-key)を設定する

mysql> ALTER TABLE blogs ADD PRIMARY KEY(id);
Query OK, 3 rows affected (0.08 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   | PRI | NULL    |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| watcher  | int         | YES  |     | NULL    |       |
| is_draft | tinyint(1)  | YES  |     | NULL    |       |
| created  | datetime    | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.03 sec)

AUTO_INCREMENTを追加する

mysql> ALTER TABLE blogs MODIFY id INT AUTO_INCREMENT ;
Query OK, 3 rows affected (0.16 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SHOW columns FROM blogs;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| name     | varchar(10) | YES  |     | NULL    |                |
| watcher  | int         | YES  |     | NULL    |                |
| is_draft | tinyint(1)  | YES  |     | NULL    |                |
| created  | datetime    | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.04 sec)

最後に

DBeaver・MySQLWorkbenchなどDBクライアントを使うと圧倒的に早くSQLを書き、挙動もすぐに確認できるメリットを痛感しました。ただ、全然書いたことがない人が、いきなりそれに手を出すと、エラーに対して適切に原因を調査して書き直すというスキルが身につきにくいかな??と感じました。

もっともっとやれることがたくさんあります(集計関数・結合など)が、その部分も一通り学習できたタイミングでアウトプットとして載せていけたらと思います^^

参考

MySQL データベースエンジンを実行している DB インスタンスに接続する:MySQL クライアントからの接続

MariaDB データベースエンジンを実行している DB インスタンスへの接続

使用するデータベースを選択する(USE文)

テーブル構造を変更する(ALTER TABLE文)

主キーの設定・削除、AUTO_ICREMENT属性の設定

PRIMARY KEY制約(主キー/プライマリキーを設定する)

テーブル定義を変更するSQL

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PDOを接続とプリペアドステートメント説明

PDOの接続方法

僕はmysqliに比べて、分かりづらかったので、PDOの接続の仕方を書いてみました。

<?php
try {
    $pdo = new PDO("mysql:dbname=データベース名; host=localhost; charset=utf8mb4", "ユーザー名", "パスワード");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "接続完了";
} catch (PDOException $e) {
    exit();
    echo "接続失敗";
}
?>

プリペアドステートメントについて

プリペアドステートメントって、初めは分かりづらいですよね。
プリペアドステートメントとは、SQL文を最初に用意しておいて、その後はクエリ内のパラメータの値だけを変更してクエリを実行できる機能のことです。
この機能を利用することでクエリの解析やコンパイル等にかかる時間は最初の一回だけで良くなり、より高速に実行することができます。
また、SQLインジェクション対策に必要なパラメータのエスケープ処理も自動で行ってくれるため、安全かつ効率の良い開発が出来ます。

プリペアドステートメントを利用してクエリを実行する流れ

PDOオブジェクトの作成

prepareメソッドでSQL文をセット

bindValue or bindParamでパラメータに値をセット

executeメソッドでクエリを実行

fetch or fetchAllメソッドで結果を配列で取得

INSERTだとこんな感じで使います。

$stmt = $pdo -> prepare("INSERT INTO blog (title, text) VALUES (:title, :text)");
    $stmt->bindParam(":title", $_POST['title'], PDO::PARAM_STR);
    $stmt->bindParam(":text", $_POST['text'], PDO::PARAM_STR);
    $stmt->execute();

参考にしたサイト
PDO prepare プリペアドステートメントの使い方

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLの基本的な関数

COUNT関数

行数を取得することができる。

スクリーンショット 2020-09-23 17.41.35.png

-- count関数の引数に*を渡した場合、nullのレコードもカウントされる
select count(*) from Shohin;

スクリーンショット 2020-09-23 17.46.13.png

-- 引数で列名を渡した場合、対象の列がnullのレコードはカウントされない
select count(shiire_tanka) from Shohin;

スクリーンショット 2020-09-23 17.51.18.png

重複を除いてカウントしたい場合、distinctを使用する。

select count(distinct shohin_bunrui) from Shohin;

スクリーンショット 2020-09-23 18.36.41.png

SUM関数

合計を取得することができる。
また、集約関数は引数に列名をとった場合、計算前にnullを除外する。
※count(*)は例外的にnullを除外しない

select sum(shiire_tanka) from Shohin;

スクリーンショット 2020-09-23 18.17.04.png

AVG関数

平均値を取得することができる。

select avg(shiire_tanka) from Shohin;

スクリーンショット 2020-09-23 18.24.55.png

MAX関数、MIN関数

最大値、最小値を取得することができる。
構文はSUM関数、AVG関数と同じだが、
SUM関数、AVG関数は数値型の列に対してのみ使用できる点に対し、
MAX関数、MIN関数は原則的にどのような型の列にも使用できる。

-- 数値型の列を指定
select min(shiire_tanka) as "最小値", max(shiire_tanka) as "最大値" from Shohin;
-- 日付型の列を指定
select min(torokubi) as "最小値", max(torokubi) as "最大値" from Shohin;

スクリーンショット 2020-09-23 18.33.12.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

FlaskでSQLiteからMySQLへ書き換えてみた

FlaskのチュートリアルではSQLiteを用いて掲示板アプリを作られていると思いますが、デプロイする際にMySQLに書き換える必要があったため書き換えたのでそれをここにも残しておこうと思います。

schema.sqlの書き換え

schema.sql
DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS post;

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);
db_mysql.py
import MySQLdb
import os

def mysql():

    # 接続する 
    # ローカルでのDB用
    conn = MySQLdb.connect(
        unix_socket = '/Applications/MAMP/tmp/mysql/mysql.sock',
        user='root',
        passwd='root',
        host='localhost',
        db='flask',
        charset='utf8'
    )

    return conn

def create_table():

    conn = mysql()

    # カーソルを取得する
    cur = conn.cursor(MySQLdb.cursors.DictCursor)

    user_drop = "DROP TABLE IF EXISTS user"
    post_drop = "DROP TABLE IF EXISTS post"
    cur.execute(user_drop)
    cur.execute(post_drop)

    # テーブルの作成
    user_table = """
        CREATE TABLE user (
        id INTEGER AUTO_INCREMENT,
        password TEXT NOT NULL,
        username VARCHAR(10) UNIQUE,
        PRIMARY KEY (id)
        )
    """

    cur.execute(user_table)

    post_table = """
        CREATE TABLE post (
        id INTEGER AUTO_INCREMENT,
        author_id INTEGER NOT NULL,
        created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        title TEXT NOT NULL,
        body TEXT NOT NULL,
        PRIMARY KEY (id)
        )
    """

    cur.execute(post_table)

    cur.close
    conn.close

schema.sqlにはSQLiteでテーブル作成のコードが書かれています。それをdb_mysql.pyにMySQLで書き換えました。MySQLdbを使うため下記コマンドを打つ必要があります。

$ pip3 install mysqlclient

db.pyの書き換え

db.pyを少し書き換えました。flask init-dbコマンドをするとdb_mysql.pyのcreate_table関数が実行されテーブル作成が行われます。

db.py
import click
from flask import current_app, g
from flask.cli import with_appcontext
from . import db_mysql


def close_db(e=None):
    db = g.pop('db', None)

    if db is not None:
        db.close()

def init_db_mysql():
    db_mysql.create_table()

@click.command('init-db')
@with_appcontext
def init_db_command():
    """Clear the existing data and create new tables."""
    init_db_mysql()
    click.echo('Initialized the database.')


def init_app(app):
    app.teardown_appcontext(close_db)
    app.cli.add_command(init_db_command)

以上でテーブルの書き換えが完了したので、あとはデータを入れたり取ってくるコードを書き換える必要がありますね。全部書くのはあれなんで一部抜粋です。

blog.pyの書き換え

blog.py
conn = db_mysql.mysql()
db = conn.cursor(MySQLdb.cursors.DictCursor)
db.execute(
    'SELECT *'
    ' FROM post'
    ' WHERE post.id = %s',  
    (post_id,)
)
posts = db.fetchone()

connでDB接続、dbで操作準備、db.executeで操作、db.fetchoneで取り出す。

以上がsqliteからMySQLに書き換える流れです。

まとめ

若干SQLiteとMySQLでは書き方が違うので多少戸惑った点があったのですが、慣れてしまえば大丈夫でした。間違い等ありましたらご指摘して頂けると幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AnsibleとJenkinsを使用してTomcat、Java、MySQLからなるイメージをデプロイ

このチュートリアルでは、AnsibleJenkinsを使用して、Tomcat、Java、MySQLで構成されたイメージをAlibaba Cloud上にデプロイします。

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

前提条件

  1. 最低でも1台のJenkinsサーバが必要です(マスターのみまたはマスター/スレーブ設定の場合)。

そして、Jenkinsサーバのマスター/スレーブ(エージェント)環境を設定したら、サーバの状態を確認してエージェントが正常に稼働していることを確認します。特に私のセットアップでは、マスターノードをJenkinsサーバとして、エージェントマシンをAnsible用に使用しています。ご希望であれば、マスター自体にAnsibleをインストールすることで、1台だけのマシンを持つことも可能です。

image.png

  1. その後、マスターマシンとエージェントマシンにAnsible Toolをインストールします。

2.Ansibleを導入します。Ansibleは、ITオートメーションのための強力なツールであり、ターゲット環境をプロビジョニングし、その上でアプリケーションをデプロイするためにCI/CDプロセスで使用することができます。しかし、Ansibleはメンテナンスが面倒で、長期的にはスクリプトを再利用してしまうことを知っておいてください。
Ansible がインストールされている集中管理された場所から、異なるサーバ/環境にまたがって同じタスクを実行する場合に役立ちます。Ansible は完全にエージェントレスであるため、ChefPuppet のような他の IaC (Infrastructure-as-Code) ツールと比較して優位性があります。Ansible を使用すると、クライアントシステムにエージェントをインストールする必要がなく、クライアントとサーバ間の SSH 通信によって自動化が行われます。指定した地域に何百ものインスタンスがあれば、すべての自動化が容易になります。AnsibleのプレイブックはYAML/YML言語で書かれています。

Ansibleになると、以下のような知識も必要になってきます。

  • Control node:Ansible がインストールされており、管理しているサーバーを担当するマシン
  • Inventory:プレイブック内のコマンド、モジュール、タスクが動作するホストとホストグループを定義するファイル。このファイルは、Ansible 環境とプラグインに応じて多くの形式のいずれかになります。プロジェクト固有のインベントリファイルを別の場所に作成するために使用します。
  • Playbook:Ansible の設定、デプロイメント、オーケストレーション言語の一部。リモートシステムに適用させたいポリシーや、一連のステップを記述することができます。

Ansible と Ansible Alicloud モジュールのインストール

まず、JenkinsにAnsibleプラグインをインストールします。そのためには、以下の手順に従います。

  1. ダッシュボードのManage Jenkinsをクリックします。

image.png

  1. プラグインの管理をクリックして、ページの右上にある検索バーで Ansible プラグインを探します。

image.png

  1. Ansible を選択して、Download now をクリックし、再起動後にインストールします。

注意: このチュートリアルで行っている現在のセットアップには必要のない Ansible Tower はインストールしないでください。

image.png

Jenkins に Ansible プラグインをインストールしたら、次は Client/Agent マシンに Ansible をインストールする手順に進みます。

クライアント/エージェントマシンにAnsibleをインストール

Alibaba Ansibleモジュールは頻繁に更新されているので、最新版はGitHubのリンクを参照することをお勧めします。

  1. エージェントマシンでターミナルウィンドウを開き、以下のコマンドを実行します。
  • CentOS 7.4を使用している場合は、このコマンドを使用すると良いでしょう。
sudo yum check-update; sudo yum install -y gcc libffi-devel python-devel openssl-devel epel-release
sudo yum install -y python-pip python-wheel
  • Ubuntu 16.04 LTSを使用している場合は、このコマンドを使用します。
sudo apt-get update && sudo apt-get install -y libssl-dev libffi-dev python-dev python-pip
  1. 次のコマンドを入力して、必要なパッケージAnsible for Alibabaをインストールします。
sudo pip install ansible

sudo pip install ansible_alicloud

sudo pip install ansible_alicloud_module_utils

Ansibleプレイブックを設定

アリババECSをプロビジョニングするためのAnsibleのプレイブックスクリプトをこちらに作成してみました。ソースコードをフォークして、環境に合わせてパラメータの値を変更することができます。

    alicloud_access_key: <Alibaba Access Key>
    alicloud_secret_key: <Alibaba Secret Key>
    alicloud_region: <Alibaba Region for your resource> e.g. - ap-south-1
    alicloud_zone: <Alibaba Zone for your resource> e.g. ap-south-1a
    password: <New VM Password>
    image: "m-a2d4qmk8v2w9s5wmh0rw"  

注:私はZhuyunが提供するAlibaba Application Stacksからイメージをインポートしています。こちらでご確認ください。Linux、Nginx、MySQL、Jdk-Tomcat(Nginx1.6-jdk1.7-tomcat7-mysql5.5-vsFTPd2.2.2)で構成されています。

アクセスキーとシークレットの生成

さて、アクセスキーとシークレットを生成する時が来ました。これを行うには、以下の手順に従ってください。

  1. アクセスキーシークレットキーを取得するには、Alibaba Cloudコンソールにアクセスして、製品メニューからリソースアクセス管理(RAM)を選択します。

image.png

  1. 左側のナビゲーションペインで[ユーザー]オプションをクリックし、[ユーザーの作成]を選択します。

image.png

  1. 新しいユーザーを作成し、ログイン名と表示名を入力します。次に、[アクセスモード]で、[プログラムアクセス]にチェックを入れます。このユーザーに Console Password Logon アクセスを提供する必要はありません。

image.png

  1. プレイブックのalicloud_access_keyalicloud_secret_keyの値となるAccessKeyIdAccessKeySecretをコピーします。

注意:ダイアログボックスを閉じると、AccessKey情報は再び利用できなくなります。したがって、ダイアログボックスを閉じる前にこの情報をコピーして保存しておくことが重要です。

image.png

  1. VPC、V-Switchs、セキュリティグループ、またはECSインスタンスのようなリソースをプロビジョニングするための適切な権限を提供します。私はAdministratorAccessを提供していますが、これはAlibaba Cloudのサービスやリソースへのフルアクセスを提供するために起こることです。

image.png

image.png

アリババクラウドの地域とゾーン

image.png

image.png

image.png

image.png

注)1.

  1. 完全なリストを取得するには、Alibaba CloudのCLIツールを使用することができます。JSONの壁を吐き出してくれるので、*nix上にいてjqツールが利用できるのも便利です。以上のことを考えると、必要なのはこの短いシェルスクリプトだけです。
#!/usr/bin/env bash

for region in $( aliyun ecs DescribeRegions | jq '.Regions.Region[].RegionId' )
do
    echo $region
    reg=$( echo $region | sed s/\"//g )
    echo '---'
    for zone in $( aliyun ecs DescribeZones --RegionId $reg | jq '.Zones.Zone[].ZoneId' | sort )
    do
        echo $zone
    done
    echo ''
done
  1. 以下の地域・ゾーンにリソースを提供したい場合は、こちらのリンクから実名登録を行ってください。
alicloud_region: cn-beijing
alicloud_zone: cn-beijing-a

以下に各リージョンのイメージIDを示します(Linux, Nginx, MySQL, Jdk-Tomcatイメージの場合)。もちろん、地域に応じてイメージIDを変更する必要があります。

image.png

Jenkinsジョブを使用してAlibaba VMを作成してデプロイする

Jenkinsジョブを使用してAlibaba VMを作成してデプロイするには、以下の手順に従います。

  1. Jenkinsダッシュボードから、New Itemを選択します。

image.png

  1. 名前を入力し、「Freestyle project」を選択し、「OK」をクリックします。

image.png

  1. (オプション) 一般の下に、参考のために簡単な説明を記載してください。

image.png

  1. 上部のソースコード管理(SCM)タブを選択するか、スクロールダウンして以下の情報を入力します。

SCM: - Git
リポジトリのURL:- GitHubのリンクにパラメータを変更したもの
例:https://github.com/nadaraj15/alibaba_ansible/
資格情報:- なし (パブリックリポジトリなので、プライベートの場合は Jenkins に資格情報を保存)
ブランチ指定子 ( 'any' の場合は空白): - */master

image.png

  1. 次に、ビルドトリガーはとりあえずスキップして、ビルド環境に移動します。新しいプロジェクトを作成する際には、いくつかの設定が用意されています。この設定ページでは、スクリプトを実行するなどの余分なアクションを実行するためのビルドステップを追加するオプションもあります。というよりも、シェルスクリプトを実行して、GitHubからAnsible Playbookファイルをダウンロードします。以下のコマンドを使用します。
sudo apt-get update  (Optional)
sudo apt-get install -y libssl-dev libffi-dev python-dev python-pip (Optional)
sudo pip install ansible[azure]==2.7.0rc2 (Optional)
sudo apt-get install -y maven (Optional)
cd /usr/bin
sudo wget https://raw.githubusercontent.com/nadaraj15/alibaba_ansible/master/AliVM.yml

image.png

image.png

  1. ビルドステップを追加して ansible playbook を起動したいと思います。このステップは ansible playbook を実行します。以下の情報を入力します。
  • Playbook path: - AliVM.yml (プレイブック名)
  • Inventory: - 「Inventoryを指定しない」を選択
  • Credentials:- 「なし」を選択します(デプロイメントファイルに資格情報を埋め込んでいるので、環境変数として資格情報を渡すことができます)

image.png

image.png

  1. デプロイ後のワークスペースをクリーンアップし、以下のコマンドでシェルスクリプトの実行ステップを追加します。

注意: jenkins_homeがあなたの場所である場合、デフォルトのパスは/var/jenkins_homeに設定されています。しかし、カスタムの場所がある場合は、その代わりにその場所を使用することができます。

sudo rm -rf /var/jenkins_home/workspaces/<workspace_name>

image.png

  1. 必要に応じてポストビルトアクションを追加します。最後に、すべてのステップが設定されたら、保存をクリックします。

image.png

  1. Jenkinsプロジェクトダッシュボードに移動し、「Build now」をクリックして手動でビルドをトリガーします。

image.png

  1. コンソール出力に移動して、トリガーされたビルドステータスを確認します。すべてのリソースが正常にプロビジョニングされると、出力に成功ステータスが表示されます。

image.png

image.png

  1. Alibaba Consoleに移動して、プロビジョニングされたAlibaba ECSと構成を確認します。

image.png

image.png

これで、Tomcat、Java、MySQLがインストールされたインスタンスをデプロイしました。ブラウザに対応するパブリックIPアドレスを入力すると、VMのパブリックIPの80番ポートを通してウェブサーバが公開されているので、Apache Tomcatのページが動作しているのが確認できます。

image.png

参考文献

1、https://www.alibabacloud.com/blog/ci%2Fcd-with-jenkins---part-1%3A-install-jenkins-on-ubuntu_593717
2、https://www.alibabacloud.com/blog/continuous-integration-with-jenkins-on-alibaba-cloud_594512
3、https://www.alibabacloud.com/blog/594449
4、https://github.com/alibaba/ansible-provider
5、https://mohitgoyal.co/2017/02/14/add-linux-slave-node-in-the-jenkins/
6、https://marketplace.alibabacloud.com/products/56728001/Tomcat_Nginx_My_SQL_Stack_Package_on_Ubuntu-cmjj011399.html?innerSource=search#product-details

アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのselectの基本操作

あるテーブルの全ての列を出力する

-- *で全ての列を指定することができる
select * from Shohin;

あるテーブルの特定の列を出力する

-- select句の後に対象の列名を記述する
-- また、複数ある場合はカンマで区切る
select shohin_id, shohin_mei, shiire_tanka from Shohin;

別名をつける

ASを使用する。
日本語をつけることもできるが、その場合ダブルクォーテーションで囲む必要がある。

select shohin_id as ID, shohin_mei as "商品名", shiire_tanka as "仕入単価" from Shohin;

重複を除く

distinctを使用する。
nullについても、1つの種類として扱われる。

select distinct shohin_bunrui from Shohin;

複数列の前にdistinctを記述した場合、
複数行の組み合わせが全く同じ行が1つにまとめられる。

-- 以下の場合、shohin_bunrui、torokubiの組み合わせが同じもののみが1つにまとめられる。
-- 例えばshohin_bunruiの値が同じでも、torokubiの値が同じでなければ1つにまとめられない。
-- distinctは先頭の前にしか書くことができない。
-- そのため、distinct shohin_bunrui, distinct torokubiとは書けない。
select distinct shohin_bunrui, torokubi from Shohin;

条件の指定

whereを使用することで検索条件を指定することができる。

select * from Shohin where shohin_bunrui = "衣服";
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのデータベース、テーブルの作成と削除、行の追加

データベース作成

create database shop;

データベース一覧

show databases;

データベース削除

 drop database shop;

テーブル作成

create table Shohin (
    shohin_id varchar(4) not null primary key,
    shohin_mei varchar(100) not null,
    shohin_bunrui varchar(32) not null,
    hanbai_tanka int,
    shiire_tanka int,
    torokubi DATE
    );

テーブル一覧

show tables;

テーブル削除

drop table Shohin;

データ追加

insertの後のintoは省略可能。
また、全てのカラムに対してデータを登録する場合、カラム名の指定を省略可能。

-- into,カラム名を省略したバージョン
insert Shohin values ('0001', 'Tシャツ', '衣服', 1000, 500, '2009-09-20');

-- 特定のカラムのみデータを登録する場合、valuesの前に対象のカラムを記述する
-- 指定されていないカラムについてはnullが入る
insert Shohin (shohin_id, shohin_mei, shohin_bunrui) values ('9999', '技術書', '経験値');

データ削除

delete from Shohin where shohin_id = 9999;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

anacondaでmysql-connector-pythonがインストール出来ない対処

状況

pythonを学習するにあたりanacondaを使用しているが、データベースを使用するためにインストールしようとしたが、エラーが出た

% conda install mysql-connector-python
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: \
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.
failed

UnsatisfiableError: The following specifications were found
to be incompatible with the existing python installation in your environment:

Specifications:

  - mysql-connector-python -> python[version='>=2.7,<2.8.0a0|>=3.7,<3.8.0a0|>=3.6,<3.7.0a0|>=3.5,<3.6.0a0']

Your python: python=3.8

If python is on the left-most side of the chain, that's the version you've asked for.
When python appears to the right, that indicates that the thing on the left is somehow
not available for the python version you are constrained to. Note that conda will not
change your python version to a different minor version unless you explicitly specify
that.

詳しくはわからないが、互換性がない?バージョンの指定が必要?などが言われているような気がする。
エラーの内容が詳しくわかる方がいるのなら教えてください。

対処法

conda install -c conda-forge mysql-connector-python
Anacondaはパッケージが少ないため、conda-forgeというチャンネルからinstallした。
pipでもインストール出来そうだが、anacondaとpipを混ぜるのは危険という記事を複数見つけたため、今回は使用しなかった。
(conda > conda-forge > pipの順で探してみるといい気がする。)

一言

conda search mysql-connector-pythonを実行したときにpkgs/main channelにあるよ!的なことがわかったから、これを入力してもインストールできるのかもしれない

コマンド実行時に複数のパッケージのインストールがされると表示されたが、これがmysql-connector-pythonの使用に必須の物なのか疑問

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む