20201117のMySQLに関する記事は11件です。

mySQLコマンドまとめ

大学のデータベースの授業のノートみたいなものです。

起動

$mysql.server start
$mysql -uroot

終了

exit;

SELECT文

SELECT 列名 FROM  WHERE 条件;

全てを指定は *

COUNT関数

SELECT COUNT(*) FROM ;

表の中の全ての行数を求める

GROUP BY句

項目ごとにグループ化

平均値の計算や集計を行う際に使用。

HAVING句

GROUP BYの結果に対して条件を付与する

ODER BY句

データを並べ替え

ASC で昇順,DESCで降順。

新規データベースを作成

create databese データベース名;

データベース一覧を表示

show databases;

データベースを指定

use データベース名;

表の作成

create table 表のタイトル(列名 データ型, ,)

データ型は intやfloatなど

charの場合はchar(5)のように最大文字数を指定。

データの挿入

INSERT INTO 表のタイトル
(列名,) VALUES
(データ,);

削除

DELETE FROM 表の名前;

表全部削除

DELETE FROM 表の名前 WHERE 削除する条件;

条件に当てはまるものを削除

表の更新

UPDATE 表の名前 SET 列名= WHERE 行選択の条件;

SET のところで四則演算も可能。

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

cargoでの複数のユニットテストを順番に実行したかったのは、DB操作で汚れちまったテーブルのクリアを最後にしたかったからなのだ。

dieselMySQL を制御している Rustのコードがありました。
cargo testで色々とデータベースを操作した後に、すっかり汚れちまったテーブルを放置しておくと次回のテストが失敗するので、ターミナルからコマンドを叩いてテーブルをクリアしていたわけです。

$ mysql -uroot -ppassword -h127.0.0.1 -e'truncate table test_database.test_teble;'

毎回叩くのも面倒なので、cargo testと一緒にやりたい。それがささやかな望みでした。

// Clean up the test_table
#[test]
fn test_cleanup_hash_file() {
    let conn = setup();
    diesel::sql_query("truncate table test_db.file_hashes").execute(&conn).unwrap();
}

こんな感じで、ユニットテストのコードを追加して $ cargo testしました。ファイルの最後に書いたので、最後に実行されてテーブルがクリアされるでしょう。そう信じて疑いませんでした。
しかし、現実は厳しいものです。そう簡単に希望を叶えてくれることはありませんでした。

とっとと結論をいいますが、cargo test によるユニットテストは 並行実行 ってコトらしいです。

今回の例でいうと、テーブルのクリアがどのタイミングで実行されるかがわからないので、テーブルクリア前提のテストは成功するか保証できないということです。

基本的に各ユニットテストはそれぞれで完結させるべきなのでしょう。

まあ、今回のように最後に後片付けしたいってコトは、DB操作とかのプログラムではありがちかもなので、どうしても順番に実行したい場合は

$ cargo test -- --test-threads=1

こうゃって。
テストを1スレッドで実行(マルチスレッドで並行実行しない)が、正解でした。

めでたしめでたし。

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

【MySQL】MySQLでデータベースに接続するまでの手順

こんにちは。
今日はMySQLでデータベースに接続するまでの手順を説明していきたいと思います。

前提条件

MySQLをインストールしていて、起動している状態で始めます。
まだインストールをしていない方はターミナルなどでインストールしてから試してみてください。

開発環境

macOS Big Sur 11.0.1
MySQL 8.0.22

MySQLにログインする

まずはターミナルでmysql -urootと入力します。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.22 Homebrew

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> 

このように表示されたら上手くログインできました。

データベースを作成する

次にデータベースを作成するコマンドを実行します。

mysql> CREATE DATABASE `mysql_test`;

すると

Query OK, 1 row affected (0.01 sec)

このように表示されます。ちゃんとデータベースを作成できたようです。

念の為、データベースを確認してみます。

show databases();

を実行すると、

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql_test         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

ちゃんとmysql_testが作成されました!

データベースに接続する

次は作成したデータベースに接続しましょう。

まずはSELECT database();で現在接続しているデータベースを確認してみます。

mysql> SELECT database();
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    11
Current database: *** NONE ***

+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)

現在はどのデータベースにも接続されていないみたいです。

use データベース名;で接続したいデータベースに接続することができるので試してみると、

mysql> use mysql_test;
Database changed

接続できました。
念の為確認すると、

mysql> SELECT database();
+--------------+
| database()   |
+--------------+
| mysql_test   |
+--------------+
1 row in set (0.00 sec)

しっかりと接続できていることが分かります!

これでデータベースに接続するまでの手順をお見せすることができました。

まとめ

Laravelとは少し手順が違うのでどちらもできるように頑張ります~

Laravelでの手順を知りたい方は是非こちらもご覧ください。
LaravelでMySQLにログインするまで
Laravelでデータベース(MySQL)を作成し、接続をする。

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

[OCI]リソース・マネージャを使って、MYSQL Database Serviceを作成してみた (2020/11/15)

この記事では、OCIのマネージドTerraform環境であるリソース・マネージャを使って、MySQL Database Serviceを作成してみたことを紹介します。

リソース・マネージャとは

Oracle Cloud Infrastructureリソースをプロビジョニングするプロセスを自動化できるOracle Cloud Infrastructureサービス
「infrastructure-as-code」モデルを使用してリソースをインストール、構成、および管理するのに役立つTerraformのマネージド環境

リソース・マネージャの機能

リソース・マネージャは以下のような特徴、機能があります(2020/11/15時点)
- インフラストラクチャの自動化と標準化、環境のレプリケーションを容易に行う
- Terraform エンジンのフルマネージドサービス
- 指定したコンパートメントのリソースをTerraform構成ファイルの生成(Resource Discovery)
- GitLabで管理されたTerraform構成ファイルからリソース・マネージャスタックの作成(構成ソース・プロバイダ)
- スタックの最後に実行された構成と実際(現在)のインフラストラクチャの状態との差分抽出(ドリフト検出)
- サンプル構成を使った環境構築
- 使用できる Terraform フォーマットは v0.11/v0.12/v0.13

以下のサンプルは Terraform v0.12 フォーマットで記載しています。

MYSQL Database Service 作成サンプル

使用している変数

  • mysql_configuration_id:MYSQL Database ServiceのコンフィグレーションIDzu05.png
  • mysql_password :管理者ユーザパスワード
  • mysql_shape :MYSQL Database Serviceで利用するシェイプ
  • privateSubnet_id :サブネットOCID

指定している名前

  • admin_username :管理者ユーザ名(admin)
  • hostname_label/display_name:ホスト名(mysql1)

そのほかはデフォルト設定を指定

mysql.tf
resource oci_mysql_mysql_db_system export_MySQL1 {
  admin_password      = var.mysql_password
  admin_username      = "admin"
  availability_domain = data.oci_identity_availability_domain.TGjA-AD-1.name
  backup_policy {
    is_enabled        = "true"
    retention_in_days = "7"
    window_start_time = "00:00"
  }
  compartment_id          = var.compartment_ocid
  configuration_id        = var.mysql_configuration_id
  data_storage_size_in_gb = "50"
  display_name = "MySQL1"
  fault_domain = "FAULT-DOMAIN-1"
  hostname_label = "mysql1"
  maintenance {
    window_start_time = "WEDNESDAY 04:22"
  }
#  mysql_version = "8.0.22-u2-cloud"
  port          = "3306"
  port_x        = "33060"
  shape_name    = var.mysql_shape
  state     = "ACTIVE"
  subnet_id = var.privateSubnet_id

  lifecycle {
    ignore_changes = [admin_password, admin_username]
  }
}
data oci_identity_availability_domain export_TGjA-AD-1 {
  compartment_id = var.compartment_ocid
  ad_number      = "1"
}

サンプル環境の作成

MySQL Database Serviceを構築する例として以下の構成を作成
zu01.gif
コンピュートインスタンスにnginxとphpをインストールし、wordpressモジュールを展開、MySQL Database ServiceにDatabaseとユーザを作成しています。
Terraform構成ファイルはgithubからダウンロード可能です。

環境構築の実行

1.Webコンソールのメニューから「リソース・マネージャ」>「スタック」を開き「スタックの作成」をクリック
2.githubから入手したtfファイルを圧縮したZIPファイルもしくはフォルダを指定してリソース・マネージャスタックを作成zu03.png
3. 計画ジョブ・適用ジョブを実行

サンプルファイルの補足

予約済パブリックIPの使用

コンピュートインスタンスとロード・バランサには、それぞれ予約済パブリックIPを割り当ててみた

予約済パブリックIPの生成

publicip.tf
resource oci_core_public_ip publicip_lb {
  compartment_id = var.compartment_ocid
  display_name = "lb01"
  lifetime = "RESERVED"
}

コンピュートインスタンスへの割り当て

パブリックIPを割り当てるVNIC、プライベートIPのOCIDを取得し、予約済パブリックIPを割り当てる

publicip_compute.tf
data oci_identity_availability_domain AD-1 {
  compartment_id = var.compartment_ocid
  ad_number      = "1"
}
data oci_core_vnic_attachments instance1_vnics {
  availability_domain = data.oci_identity_availability_domain.AD-1.name
  compartment_id      = var.compartment_ocid
  instance_id         = oci_core_instance.ap1.id
}

data oci_core_vnic instance1_primary_vnic {
    vnic_id = data.oci_core_vnic_attachments.instance1_vnics.vnic_attachments[0].vnic_id
}

data oci_core_private_ips instance1_ip {
    vnic_id = data.oci_core_vnic.instance1_primary_vnic.id
}
resource oci_core_public_ip publicip_ap {
  compartment_id = var.compartment_ocid
  display_name = "ap01"
  lifetime      = "RESERVED"
  private_ip_id = data.oci_core_private_ips.instance1_ip.private_ips[0].id
}

ロード・バランサへの割り当て

publicip_lb.tf
resource oci_load_balancer_load_balancer LB1 {
  compartment_id = var.compartment_ocid
  display_name = "LB1"
  ip_mode    = "IPV4"
  is_private = "false"
  reserved_ips {
    id = oci_core_public_ip.publicip_lb.id
  }
  network_security_group_ids = [
    oci_core_network_security_group.export_Network-Security-Group-for-AP.id,
  ]
  shape = "100Mbps"
  subnet_ids = [
    oci_core_subnet.export_PublicSubnet.id,
  ]
}

適用ジョブログ

適用ジョブのログに、ロードバランサ、APサーバのパブリックIPアドレスとAPサーバへのsshログイン用秘密鍵ファイル内容が出力される
zu04.png

wordpressの初期設定

コンピュートインスタンスのパブリックIPアドレスに ブラウザで httpアクセスすることで wordpress 初期画面が表示されることを確認
http://<コンピュートインスタンスパブリックIPアドレス>/
zu02.png

おわりに

OCIの Terraform マネージドサービスのリソース・マネージャを使用して MySQL Database Serviceおよびそれにアクセスするコンピュートインスタンスにwordpress環境をデプロイしてみた。

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

MySQLで取得結果にランクをつける

金額の高い順にランクをつける。

対象のテーブル

select
*
from
products

+-----------+-------+
| name      | price |
+-----------+-------+
| スイカ    |    80 |
| バナナ    |    50 |
| ぶどう    |    50 |
| みかん    |   100 |
| りんご    |    50 |
| レモン    |    30 |
+-----------+-------+

相関サブクエリを用いる方法

SELECT P1.name,
P1.price,
(
    SELECT COUNT(P2.price)
    FROM Products P2
    WHERE P2.price > P1.price
) + 1 AS rank_1
FROM Products P1
ORDER BY
rank_1;

+-----------+-------+--------+
| name      | price | rank_1 |
+-----------+-------+--------+
| みかん    |   100 |      1 |
| スイカ    |    80 |      2 |
| バナナ    |    50 |      3 |
| ぶどう    |    50 |      3 |
| りんご    |    50 |      3 |
| レモン    |    30 |      6 |
+-----------+-------+--------+

ランクを0から始めたい場合、+1を消せば良い。
また、count(distinct p2.price)とすれば、
同じ順位にならず、飛び石でランクがつけられる。

みかんのrank_1の値に1がつく理由としては、
みかんのprice(100)以上のレコードがないため、
where P2.price > P1.priceをcountした結果が0になるため。

また、自己結合を用いる方法もある。

SELECT P1.name,
MAX(P1.price) AS price,
COUNT(P2.name) +1 AS rank_1
FROM Products P1 LEFT OUTER JOIN Products P2
ON P1.price < P2.price
GROUP BY P1.name
ORDER BY
rank_1;

こちらを参考にさせていただきました。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ

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

[備忘録]MySQLのコマンド

データベース

ローカル環境でMySQLに接続する

$ mysql -u ユーザー名 -p [データベース名]

データベースの新規作成

MySql> CREATE DATABASE [任意のデータベース名];

データベースの表示

MySql> SHOW DATABASES;

データベースの選択

MySql> USE データベース名;

データベースの削除

MySql> DROP DATABASE [任意のデータベース名];

ログアウト

MySql> EXIT;

テーブル

テーブルの作成

MySql> CREATE TABLE テーブル名 (カラム名1 データ型1, カラム名2 データ型2, ...);

(例)idカラムとnameカラムを持ったcategoriesテーブルを作成

MySql> CREATE TABLE categories (id INT, name VARCHAR(100));

データ型の種類

データ型 意味
INT 数値
DECIMAL  少数。例えば DECIMAL(5, 2) とした場合、小数点以下が2桁、全体で5桁の数値を格納することができる。この場合、格納できる値は、-999.99 から 999.99 の範囲になります。
VARCHAR(文字数) 文字列。後ろにカッコで文字数を指定して使う。VARCHAR(100) のように指定すると、ひとつのフィールドに100文字まで保存できる。
DATETIME 日時。
DATE 日付。

テーブルの一覧表示

MySql> SHOW TABLES;

テーブルの削除

MySql> DROP TABLE テーブル名;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでMySQLのコンテナが立ち上がらない

Docker使っててMySQLのコンテナが立ち上がらない現象にでくわしました。
原因はわかってないですが解決したので、一旦メモを残します

環境

  • Docker Desktop ver 2.5.0.1
  • Docker Compose ver 1.27.4
  • MySQL 8

先に結論

Use gRPC FUSE for file sharing をdisableにして Apply & Restart。

起きたこと

docker-compose up -d

を実行して

Creating network "xxx" with the default driver
Creating xxx_architecture_mysqldata_1 ... done
Creating xxx_mailhog_1   ... done
Creating xxx_architecture_mysql_1     ... done
Creating xxx                      ... done

の状態になったのですが、作業中にMySQL起因のエラーが発生。

確認してみる

docker ps

まず

docker ps

で何が立ち上がっているのか確認しましたが、MySQLのコンテナは立ち上がっていないようでした。
docker execでMySQLのコンテナに入れるのか試してもみましたが...

Error response from daemon: Container コンテナID is not running

だめでした。

docker-compose upしたときはdoneと出ていたので立ち上がっているものと思っていましたが...。

ログを見てみる

とりあえずこういう時はログを見てみないとなんとも言えないので、とりあえずログを確認します。

docker logs コンテナID

ログはこんな感じ

2020-11-17 07:30:22+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
2020-11-17 07:30:23+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-11-17 07:30:23+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
2020-11-17T07:30:24.278825Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2020-11-17T07:30:24.279399Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 1
2020-11-17T07:30:24.298133Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
2020-11-17T07:30:26.062069Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('2') and data dictionary ('0').
2020-11-17T07:30:26.064235Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2020-11-17T07:30:26.064751Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-11-17T07:30:26.944800Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19)  MySQL Community Server - GPL.

↓ここでなんか失敗してますね

2020-11-17T07:30:26.064235Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2020-11-17T07:30:26.064751Z 0 [ERROR] [MY-010119] [Server] Aborting

とりあえずbuildしなおしてみる

いろいろググるのがめんどくさくてbuildしなおしました。

docker-compose build --no-cache

buildが終わったので docker logs でログを見てみましょう。

2020-11-17 08:07:48+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
2020-11-17 08:07:49+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-11-17 08:07:49+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
2020-11-17T08:07:49.831146Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2020-11-17T08:07:49.831363Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 1
2020-11-17T08:07:49.854161Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
2020-11-17T08:07:51.391894Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('2') and data dictionary ('0').
2020-11-17T08:07:51.392387Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2020-11-17T08:07:51.392606Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-11-17T08:07:52.248666Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19)  MySQL Community Server - GPL.

なおってへんやん

解決した方法

これ
https://stackoverflow.com/questions/64146845/mysql-not-starting-in-a-docker-container-on-macos-after-docker-update

Docker DesktopのPreferences > Experimental Features で
Use gRPC FUSE for file sharing
をdisableにしてApply & Restart

その後docker-compose upしたら普通に立ち上がりました。

ちなみに別プロジェクトではほぼ同じセッティングでMySQL5.7を使用しており、そちらではUse gRPC FUSE for file sharingがenableになっていても全く問題ありませんでした。
MySQLのバージョン違いで起こる問題なんでしょうか

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

InterventionImageで編集した画像ファイルをbase64変換してMySQLに保存する

やりたいこと

InterventionImageで編集した画像ファイルをバイナリーに変換してMySQLに保存したい
もちろん画像ファイルは/public配下やS3などのファイルシステムに保存するのが定石なのは承知の上で、今回は手軽さを優先してDBに画像ファイル自体をtextカラムに保存する

環境


% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H2

% docker version
Client: Docker Engine - Community
 Cloud integration: 1.0.1
 Version:           19.03.13
 API version:       1.40

# php -v
PHP 7.4.7 (cli) (built: Jun 11 2020 18:41:17) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans

# php artisan -v     
Laravel Framework 7.26.1

# mysql --version
mysql  Ver 14.14 Distrib 5.7.30, for Linux (x86_64) using  EditLine wrapper

Intervention Image とは

ImageMagikの上位互換?のモダンな画像編集パッケージ
リサイズ、トリミング、フィルターとなんでも手軽にできるっぽい
詳しくは公式doc参照

MySQLに画像バイナリを保存する

UserController
    public function update(Request $request, User $user)
    {
        // InterventionImageで加工&保存
        $file = $request->file('profile_img');
        $img = Image::make($file);
        $img->fit(400); //400px * 400px にトリム&リサイズ
        $bin = base64_encode($img->encode('png'));

        $user->profile_img = $bin;
        $user->save();
        return redirect()->route('user.index');
    }

ポイントは$bin = base64_encode($img->encode('png'));の1行。
base64_encodeする前に一度InterventionImageインスタンスをエンコードしている。
この処理がないとbase64_encodeしても空文字が生成される。なぜかはよくわからない。

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

ESP32とMySQLとXAMPPを使ってWiFi強度(RSSI)をリアルタイムで閲覧したい

たまにネットワークが途切れるがどのネットワークが強いのか接続しないと分からないなぁ。のひとことから勉強のつもりで作ってみました。
esp32でRSSIを取得するコードがなかなかみつからなかったのでここに残します。
arduino ideのソースコードに関してはほぼ初心者でhtmlは今回の件で初めて触りました。
自分で見てもかなり見にくいのでアドバイスもいただけますと幸いです。
もちろん市販品のほうが性能もよく見やすいのは承知です。

今回の目標

①esp32でRSSIを取得しMySQLへ蓄積。
②MySQLに蓄積されたデータをxamppを使い社内のみブラウザで閲覧できるようにする。

①の攻略

まずソースコードは以下の通り。
環境設定をしたarduino ideへ。

esp32_wifi_power_complete.ino
 #include <SPI.h>
#include <WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

const char ssid[] = "*******";
const char pass[] = "*******";

//ESP32のIPアドレス
IPAddress ip(***, **, **, ***);
IPAddress gateway(***, **, **, *);
IPAddress subnet(255, 255, 255, 0);

// Wifi 通信用
WiFiClient client;

// SQLサーバーのIPアドレス
IPAddress server( ***, **, **, ***);
// SQLユーザー名
char user[] = "*******";
// SQLパスワード
char password[] = "*********";

// SQLコマンド用
MySQL_Connection conn ((Client *)&client);

char INSERT_SQL[] = "INSERT INTO schemas名.テーブル名(要素①, 要素②, 要素③, RSSI) VALUES('***', '***', '****', %ld)";

long get_current(void);
void insert_data(long);


void setup()
{

 Serial.begin(115200);

 WiFi.config(ip, gateway, subnet);

 WiFi.begin(ssid, pass);

 Serial.println("WiFi connecting");

 Serial.println(WiFi.localIP());

 //SQLサーバへの接続
 Serial.println("Connecting Database");
 if (conn.connect(server, 3306, user, password)) {
   delay(10000);
 }
 else {
   Serial.print("Connection failed!");

 }
 //SQLサーバの切断
  conn.close();

}

void loop () {

  int i;

  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("Couldn't get a wifi connection");
    WiFi.begin(ssid, pass);
    delay(1000);

  }

  long rssi = WiFi.RSSI();
  Serial.print("RSSI:");
  Serial.println(rssi);
   Serial.println(ssid);
  delay(1000);

    //SQLサーバへの接続
  Serial.println("Connecting Database");
  if (conn.connect(server, 3306, user, password)) {
    delay(1000);
    //データの書き込み
    insert_data(rssi);
  }
  else {
    delay(1000);
    Serial.print("Connection failed!");

  }

  conn.close();

  //26秒待つ
  for (i = 0; i < 26; i++) {
    delay(1000);
  }

}

//SQLサーバへの書き込み
void insert_data(long rssi)
{

  char buf[600];

  Serial.print("Recording data=");
  Serial.println(rssi);

  sprintf(buf, INSERT_SQL, rssi);

  //SQLの書き込みオブジェクトの作成
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  //SQLの書き込み
  cur_mem->execute(buf);
  //SQLの書き込みオブジェクトの開放
  delete cur_mem;

}

MySQLの使い方やarduino ideでのESP32の環境設定などはわかりやすいサイトが多くありますのでそちらをご覧ください。

いろんなところから引き抜いてきたコードなので不要な箇所もあるかもしれませんが一応正常に動作しています。

以前まで動作中にWiFi接続が切れてしまうことやMySQLへの接続がきれてしまうことがありましたが、このプログラムに変更してから切断されても再接続できるようになりました。

私は初心者なのでMySQL Workbenchで確認をしていますがもちろんコマンドプロンプトからも可能です。

データが送られていることが確認できれば①は攻略です。

自分の努力の割に説明することが少ないので不明な点はご質問ください。

随時更新します。

②の攻略

MySQLにデータを蓄積することは今までも経験があったのですが、正直そこで満足していました。
でもせっかく時間があるので社内のみで見れないかな~と考えていた時に出会ったのがxamppです。
xamppについては以下のページが鬼分かりやすかったのでリンクを貼っておきます。

markdown:https://www.adminweb.jp/xampp/
Markdown:https://techacademy.jp/magazine/1722

これらの基礎を踏まえて以下のコードになりました。

test.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>タイトル</title>


<style>

h1{ color: blue; }

h1{ background: white}

body{ background: black }

body{ text-align: center }

.first{ border: double 10px brown }

h1{ border-bottom: dotted 5px brown }

.side{ display: flex;
 justify-content: space-around; }

body{ color: white;}

</style>

</head>

<body>

<h1>表題</h1>

<div class="first">
<h2>強度の見方</h2> 
<p>RSSI=0 ・・・世界最強</p>
<p>RSSI=-50 ・・・結構いい</p>
<p>RSSI=-75 ・・・普通</p>
<p>RSSI=-100 ・・・接続不可</p>
</div>

<div class="data">

<h2>Shinto 1F</h2>

<?php

$dsn = 'mysql:dbname=*******;host=localhost';
$user = '******';
$password = '*******';

try{
    $dbh = new PDO($dsn, $user, $password);

    $sql = 'select * from **** where **** = "*********" order by PK desc limit 1';
    foreach ($dbh->query($sql) as $row) {
        print($row['*****'].' *****');
        print($row['*****'].' *****');
        print($row['****']);
        print('<br />');
    }
}

catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}
?>

</div>

</body>
</html>

そして
http://*****/test.phpにアクセスするとまあ見れるぐらいのものが表示されるはずです。

終わりに

もし興味があればご連絡下さい。
一応ほぼ0からの素人が0から作ったのである程度は説明できると思うのですが投稿するのになれてなさ過ぎてなにを書けばいいかさっぱりです。
連絡いただければ必ず返答しますのでお許しください。。。

今後はHTMLの勉強をしてかっこいいページをつくりたいですね

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

pythonでのMysqlの使い方

はじめに

この記事はYoloで受け取ったデータをもとに可視化する為の方法として,Mysqlを利用する方法を記入していくつもりです.
Mysqlの使い方は以下の記事を参考に記事にしていきたいと思います.

Python + mysql-connector-python の使い方まとめ
https://qiita.com/valzer0/items/2f27ba98397fa7ff0d74

環境

python8.x
xamppを利用(Mysql)

使用しているライブラリ

mysql.connector

データベースの構成

databasename:mask
table:mask-ok-or-ng1
カラム:3

name format
day day
time time
ok-or-ng text

実装したコード

def sqlng():
 day = datetime.date.today()
 time1 = datetime.datetime.now()
 conn = mydb.connect(
        host='127.0.0.1',
        port='3306',
        user='userid',#ユーザidの記入
        password='password',#パスワードの記入
        database='databasename'#データベースの名前を記入
    )
 # コネクションが切れた時に再接続してくれるよう設定
 conn.ping(reconnect=True)
 # 接続できているかどうか確認
 print(conn.is_connected())
 cur = conn.cursor()
 time2=str(time1.hour)+":"+str(time1.minute)+":"+str(time1.second)
 print(day)
 print(time2)
 cur.execute("INSERT INTO `mask-ok-or-ng1` (`day`, `time`, `ok-or-ng`)"+ "VALUES"+ "("+"'"+str(day)+"'"+","+"'"+str(time1)+"'"+","+"'NG')")
 conn.commit()
 cur.close()
 conn.close()

工夫している点としては,任意の変数をデータベースに挿入するときに,参照記事のやり方だとタプル型は使えないとエラーを吐かれたので上記のやり方でやりました.

# executemanyで複数データを一度に挿入
records = [
  (5, 'MONA', 3000),
  (6, 'XP', 1000),
]
cur.executemany("INSERT INTO test_table VALUES (%s, %s, %s)", records)

このやり方だとエラーを吐いた.
ここを下記のようにした.

 cur.execute("INSERT INTO `mask-ok-or-ng1` (`day`, `time`, `ok-or-ng`)"+ "VALUES"+ "("+"'"+str(day)+"'"+","+"'"+str(time1)+"'"+","+"'NG')")

最後に

これは個人的なメモ的に残しているので参考になると幸いです.

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

Golang mysql CREATE DATABASE IF NOT EXISTS

こんにちは!Golang 勉強中です!

今回はDB作成〜接続を行なっていきます!

DB接続の方法はすぐに見つかりましたが、DB作成は手動でしている記事が多い印象でした。
直接Mysqlから実行ではなく、GOからオートマチックに操作したかったので方法を調べてみました。

参考記事

package main

import (
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

// DbConnection grobal
var DbConnection *sql.DB

func checkDb() {
    DbConnection, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/")
    if err != nil {
        panic(err)
    }
    defer DbConnection.Close()

    _, err = DbConnection.Exec("CREATE DATABASE IF NOT EXISTS db_name")
    if err != nil {
        panic(err)
    }
    DbConnection.Close()

    return
}


func main() {
    checkDb()
}

packageがimportできてないとエラーが出るので適宜importしてください!

以下解説

こちらのコードでmysqlと接続しています
"root:@tcp(127.0.0.1:3306)/"

root ユーザー名
:以降 パスワード (今回はルートユーザーなのでパスワードなしです)
@以降 プロトコル

mysqlと接続後にこちらのコードでDBの存在チェックと作成を行います。
DbConnection.Exec("CREATE DATABASE IF NOT EXISTS db_name")

関数を呼び出して実行します。

func main() {
    checkDb()
}

以上です!

DBの操作はORMを使っていきたいと思ってます!
ご指摘あればぜひお願いします!

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