20191201のMySQLに関する記事は4件です。

Web開発勉強のためWordpressでポートフォリオサイトを開設するまで①

Web開発を勉強するにあたり、まずは独学で下記のサイト・サービスを利用してみました。

・Progate
https://prog-8.com/
→言語の違いについては学べたが、もう少し難しいほうがいいと思いやめる。

・Ruby on Rails チュートリアル
https://railstutorial.jp/
→Rubyのバージョンの違いなど細かな違いのせいか、同様のコマンドを入力してもエラーが頻発。
いろいろ調べて解決するも、肝心のHerokuデプロイがどうしてもうまくいかず挫折。

あとは海外のサイトなので忘れましたが、言語別にFizzbuzzやらアルゴリズムを解くサイトを覗いて、アルゴリズムがわかっても初心者にすぐ実装できるスキルなぞあるはずもなく挫折。

ここまでで1か月ぐらいは消費したと思います。

その後、2か月ぐらいQiitaを眺めて興味ありそうなワードはネットで調べて、みたいなことを繰り返してました。
ムダに知識だけが増えていって、典型的な「わかる」けど「できない」使えない人間への道を歩んでいますw

さすがに手を動かさないとマズいかなーと思い、かといって上記のように独学でやるのはムリかなと判断し、Udemyのオンライン講座に課金することを決意しました。
https://www.udemy.com/mobile/ipad/

Web開発はWordpressやらrubyやらはオワコンで、時代はDjangoやらNode.jsだ!と3か月に渡るネットサーフィンで得た知識を参考に講座を探したんですが、あんまりよさげな講座(初心者がすぐにサイト公開できそうな講座)がなかったので、ノウハウが蓄積されてるであろうWordpress、rubyの講座を購入しました。

前置きが長くなりましたが、次回からはWordpressを使った講座のなかで詰まったところや、解決した方法について記事を書いていきたいと思います。

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

Node.js & Express & MySQL & React でTODOリスト API編

目的

ReactでTODOアプリを作成したことはありますが、自分でAPIを書いたことがなかったので書いてみました。
Web企業未経験なので、間違いなどありましたらご指摘いただけると助かります!

APIを書くまえに

まずは簡単にNode.jsとReactの勉強をUdemyで行いました。
Linkは下記になります。

【フロントエンドエンジニアのための React ・ Redux アプリケーション開発入門】
https://www.udemy.com/course/react-application-development/

【Node.js速習講座 Part1 <導入&基礎編>】
https://www.udemy.com/course/nodejs-part1/

【Node.js速習講座 Part1 】
https://www.udemy.com/course/nodejs-part2-express/

データベースとテーブルの準備

まずはじめにMySQLで必要なテーブルを準備します。

$ sudo service mysqld status

$ mysql -u root

mysql> create database todo_api;

mysql> use todo_api;

mysql> create table todo_list(id int auto_increment, name varchar(255), isDone boolean, index(id));

mysql> insert into todo_list(name, isDone) values('todo sample', true);

mysql> exit

name : やることを保存
isDone : todoが完了しているか(true / false)

これでテーブルの準備は完了です。
AUTO_INCREMENTを使用する際はindexを作成する必要がある点にご注意ください。

Node.jsで実際に処理を書いていく

ここからがいよいよAPIを書いていきます。

まずは、必要なnpmパッケージをインストールしましょう。

# 作成したディレクトリ内で
$ npm init

$ npm install express --save
$ npm install body-parser --save
$ npm install mysql --save

body-parserを使用することで、データの取得が容易になります。
後ほど使用します。

まずは、定型文的な処理を書いていきます。

index.js
const express = require("express")
const app = express()
const bodyParser = require("body-parser");
const mysql = require("mysql")
app.use(bodyParser.urlencoded({ extended: true }));

# *******は、ご自身のパスワード
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '*******',
  database: 'todo_api'
})

connection.connect();

const port = process.removeListener.PORT || 3000;

app.listen(port)

ここからMethotごとの処理を記述していきます。
まずはgetから

index.js
app.get('/api/v1', (req, res) => {
  connection.query('select * from todo_list', (error, results, fields) => {
    if (error) { console.log(error) }
    res.send(results)
  })
})

app.get('/api/v1/:id', (req, res) => {
  connection.query("select * from todo_list where id = ?", req.params.id, (error, result, fields) => {
    if (error) { console.log(error) }
    res.send(result)
  })
})

select * from todo_list where id = ?", req.params.id はSQLインジェクション対策です。
select * from todo_list where id = ${req.params.id}" は危険です。
他は簡単ですね。

続いてPOST

index.js
app.post('/api/v1', (req, res) => {
  let todo = {
    name: req.body.name,
    isDone : req.body.isDone
  }

  connection.query("insert into todo_list(name, isDone) values(?, ?)", [todo.name, todo.isDone], (error, results, fields) => {
    if (error) { console.log(error) }
    res.send(todo)
  })
})

body-parserを使用することによって、req.body.nameのように書くことでデータを取得することができます。
ただ、APIとして使用する際にtodoというオブジェクトが必要なのかどうかは自分はまだよくわかっていないので、
もしかしたら消すかもしれません(笑)

続いてPUT

index.js
app.put('/api/v1/:id', (req, res) => {
  connection.query(`select * from todo_list`, (error, results, fields) => {
    connection.query("update todo_list set name = ?, isDone = ? where id = ?",
      [req.body.name, req.body.isDone, req.params.id], (error, result, fields) => {
        if (error) { console.log(error) }
        res.send(result)
      })
  })
})

update todo_list set name = ?, isDone = ? where id = ?,[req.body.name, req.body.isDone, req.params.id]は、
? は複数個になった場合は引数に配列で値を配置します。
配置する値がフィールドの場合は ?? とします。

書き方はとんでもなく汚いような気がします。。。。。
何か他の方法があれば教えていただきたいです(切実)
やっていることは、POSTの処理のSQL文をUPDATEにしただけです。
簡単ですね。

最後にDELETE

index.js
app.delete('/api/v1/:id', (req, res) => {
  connection.query(`select * from todo_list`, (error, results, fields) => {
    connection.query("delete from todo_list where id = ?", req.params.id, (error, result, fields) => {
      if (error) { console.log(error) }
      res.send(result)
    })
  })
})

特に解説する部分はありません。

Postmanでテスト

APIを作成する際はPostmanが便利です。
Link https://www.getpostman.com/

試しにGETを送信すると、こんな感じでJSON形式でデータが返ってきます。

スクリーンショット 2019-12-01 18.04.44.png

いい感じですね。

終わり

これでとりあえずAPIは終了です。
昨日Nodeの勉強を始めたばかりなので、書き方が間違えている部分はお許しください(笑)

今後はAPIをHerokuにデプロイして、それを使用してReactでTODOリストの作成をします。
強強エンジニアの方、ぜひ間違えている部分を個人的にでもコメントにでも良いので教えていただきたいです。

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

MySQLに対応したogr2ogr(GDAL)をインストールする方法まとめ

※本記事はRDBMS-GIS Advent Calendar 2019の1日目の記事です。

はじめに

現時点(2019/12/1)では、MySQLにシェープファイルをインポートするにはogr2ogrというGDALというライブラリに含まれるコマンドラインツールを利用するのが一般的です。

ただ、GDALをインストールする方法がいくつか存在するため、慣れていないと「どれを使うのが良いの?」と戸惑います。本記事は「これからogr2ogrを使ってMySQLにシェープファイルをインポートしたい」という人用におすすめの方法をまとめておきます。

PostGIS使いもシェープファイル以外のファイルをシェープファイルに変換する際等にogr2ogrを使えるので有用かもしれません。

GDALインストール方法の選基準は下記です。

  • MySQLドライバが有効な状態でビルドされていること。
    • MySQLのインポートに必要であるため。
  • 最新(に近い)ソースでビルドされていること。
    • MySQLドライバの開発スピードが早いため。(古いと致命的なバグもある)

ogr2ogrを使ったシェープファイルのインポートについては本記事ではあまり説明しません。本記事ではあくまでGDALのインストール方法について解説します。

ogr2ogrを使ったMySQLへのシェープファイルのインポート方法については下記記事を参照して下さい。

https://qiita.com/miyauchi/items/c8349e1e6339bdf26a20

結論

公式で配布されてるDockerイメージ使うのが最も手っ取り早いです。

https://github.com/OSGeo/gdal/tree/master/gdal/docker

ただ、ogr2ogrのためだけににDockerを使うのはオーバーヘッドが大きすぎるのも事実です。

ので、各プラットフォーム毎でいえば下記もおすすめです。

  • Windows
    • OSGeo4W
    • GISInternals
  • Linux
    • ソースからコンパイル

以降はそれぞれの方法についての解説です。

Dockerイメージを使う(Windows/Mac/Linux共通)

Dockerエンジンのインストールや使い方については省略します。

GDALのDockerイメージは下記で配布されています。

https://github.com/OSGeo/gdal/tree/master/gdal/docker

まずはイメージを準備しましょう。いくつかイメージが用意されていますが、使うのはosgeo/gdal:ubuntu-full-latestである点に注意して下さい。(MySQLドライバが含まれるため)

 $ docker pull osgeo/gdal:ubuntu-full-latest

コンテナを起動します。ここではホストの/home/ディレクトリをマウントしています。

 $ docker run -v /home:/home -it --rm osgeo/gdal:ubuntu-full-latest

コンテナに入ったら、こんな感じでシェープファイルの文字コードを変換したり、MySQLにインポートしたりできます。

 root@43dd82bfeb90:/# cd [シェープファイルが格納されたディレクトリ]
 root@43dd82bfeb90:/# ogr2ogr -f "ESRI Shapefile" -lco ENCODING=UTF-8 -oo ENCODING=CP932 [変換後のシェープファイル名] [変換前のシェープファイル名]
 root@43dd82bfeb90:/# ogr2ogr -f "MySQL" "MySQL:[MySQLのデータベース名],host=[MySQLのホスト名],user=[MySQLのユーザ名],password=[MySQLのパスワード]" [変換後のシェープファイル名]

Windows

Windowsの場合はOSGeo4WやGISInternalsで配布されているインストーラを使うのがお手軽です。

OSGeo4Wを使う場合は、インストールするGDALのバージョンが選択できるので、最新版を選ぶと良いでしょう。
どちらもMySQLドライバが有効な状態でビルドされているようです。

Linux

ソースからのコンパイルについてはこちらの記事で紹介しています。MySQLを有効にするのを忘れないようにしましょう。

https://qiita.com/miyauchi/items/c8349e1e6339bdf26a20

OSのパッケージリポジトリに登録されているGDALを使うと、本記事執筆時点ではバージョンが古かったりMySQLドライバが有効でなかったりするのでおすすめしません。

Mac

未調査です。私はDockerを使っています。

まとめ

shp2mysqlみたいなコマンドが早くできたら、わざわざこんな面倒な作業しなくて済むんですけどね。

という機能追加リクエストも出ているので「Affects me」すると優先順位が上がるかもしれないのでおすすめです。

https://bugs.mysql.com/bug.php?id=90023

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

redashでMySQL自体の見える化

背景

  • システム系の情報表示はMackerelで事足りるのですが、もう少し細かいDBの値をちらっと見るためにMySQL自体の統計表示をしてみました。
  • とはいってもデータ系で数字が出る指標は少ないのでこの程度です。これは、誰でもすぐに真似して使える指標だと思います!

実行例

MySQL_stat-scaled.png

上記のダッシュボードのクエリーは超単純です。いつも見慣れたMySQLの統計情報を出すだけです。

show table status;

InnoDB関連はこちら

SELECT (sum(database_pages)/sum(pool_size)) *100 AS used,
       sum(pool_size),
       sum(free_buffers),
       sum(database_pages)
FROM information_schema.INNODB_BUFFER_POOL_STATS

まとめ

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