- 投稿日:2019-03-18T17:00:16+09:00
検索したデータの形成 SQL
データの結合
- CONCAT関数
ターミナルSELECT CONCAT(family_name,first_name) FROM users; #こうするとfamily_nameとfirst_nameが結合する。 #このようにいくつかのデータを用いて1つのデータを作りたいときにCONCAT関数を使う。 #ただ検索結果のカラム名はSQL文そのままとなっているので少し見にくくなる。検索結果のカラム名の変更
- AS句
SELECT句でデータを取得するとき、AS句を併用するとそのカラムに別名をつけられる。
ターミナルSELECT CONCAT(family_name,first_name) AS "氏名" FROM users; #こうすることでfamily_nameとfirst_nameが連結し、連結したカラム名が"氏名"になる。 #またAS句は省略することができる。 SELECT CONCAT(family_name,first_name) "氏名" FROM users; #AS句を省略した記述。重複する行の除外
- DISTINCTキーワード
ターミナルSELECT DISTINCT カラム名; #重複していれば一つしか表示しない。レコードのグループ化
- GROUP BY句 指定したカラムが同じ値を持つデータを一つのグループとしてまとめることができる。
ターミナルGROUP BY カラム名; #実行するとDISTINCTと同じような結果が返ってくるが、表示されていないだけで内部ではグループ化されたデータが存在する。レコードの数を数える
- COUNT関数
COUNT関数はグループ化されたデータに対して使用することができる集計関数の一つ。
グループ化されたデータに使用できる集計関数は他に、AVG(平均を求める),MAX(最大値を求める),MIN(最小値を求める)がある。
COUNT関数はカラムを指定して使用することで、そのカラムの値がNULLでないデータの行数を取得することができる。
GROUP BY句を併用している場合は、各グループがレコードを何個持っているかというデータを取得することができる。ターミナルSELECT COUNT(カラム名); #グループ化されているカラムを記述する。 SELECT COUNT(*); #ワイルドカードも使用できる。テーブルの結合
- JOIN
JOINを使用すると、指定したそれぞれのテーブルのカラムの値が一致するデータを結合することができる。
JOINはFROM句の後に記述し、結合の対象となるテーブルを指定する。ターミナルFROM テーブル名1 JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2カラム名2; #例えば FROM shifts JOIN users ON shifts.user_id = users.id #ONの後が冗長になるのでシンプルに書くなら FROM shifts s JOIN users u ON s.user_id = u.id #shiftsをs、usersをuと別名をつける。 #別名をつけることができるAS句は省略することができる。例文
(わかりやすく短文で区切ります)ターミナルSELECT CONCAT(family_name, first_name) "名前", #shiftsテーブルのfamily_nameと、first_nameを結合させ、名前という別名をつけ、表示させる。 COUNT(*) "コマ数" #グループ化したデータの行数を表示する。(この場合user_idがグループ化されているので同じuser_idが何行あるのかが表示される。)ワイルドカード(*)を使用することでNULLであるレコードも含めて表示する。 FROM shifts s #shiftsテーブルから検索する。(shiftsテーブルにsという別名をつける。) JOIN users u ON s.user_id = u.id #JOINで連結させたいusersテーブルを選択、ONで一致するカラムを選択し、連結させる。(usersテーブルにもuという別名をつけ、ONで別名を使用しカラム同士を連結させる。) WHERE date = "2015-07-01" #dateカラムが2015-07-01のものを検索している。 GROUP BY user_id; #複数あるuser_idがグループ化される。検索した結果からさらに検索
- サブクエリ
例えば
ターミナルSELECT DISTINCT user_id FROM shifts WHERE date = "2015-07-01";のような検索結果があったとする。
まず上記のコードの説明。
FROM shiftsでshiftsテーブルを検索対象とし、WHEREでshiftsテーブルのdateカラムが2015-07-01のものを探し、SELECT DISTINCT user_idで重複しているuser_idを一つだけ表示させている。
つまり、dateカラムが2015-07-01に当てはまるuser_idを表示する。
この検索結果を踏まえて逆に2015-07-01に当てはまらないuser_idを調べたい。その時の検索の仕方がこうだ。
ターミナルSELECT * #カラムを全て取得 FROM users #usersテーブルの検索 WHERE id NOT IN ( #NOT IN()を使用し、()内の検索結果に当てはまらないレコードを取得する SELECT DISTINCT user_id FROM shifts WHERE date = "2015-07-01" );こうすることで()内に記述された検索結果に含まれないusersテーブルのレコードを取得できる。
- 投稿日:2019-03-18T16:00:21+09:00
Djangoをtutorialの流れを書いてみた。~ing
現在の環境
- python 3.7
- Django 2.1.7
- mysql
基本setting
- $django-admin startproject shop
- project start!
- shop = project name
- shop/setting.py からのsetting
- LANGUAGE_CODE = 'ja-jp'
- TIME_ZONE = 'Asia/Tokyo'
- $python manage.py startapp board
- app start!
- board = app name
- shop/setting.py へapp登録
- INSTALLED_APPS = [
'board', <-作ったapp name ......
]- shop/setting.py
- DATEBASEのsetting
DATABASES = { 'default': { 'ENGINE': 'mysql.connector.django', 'NAME': '', #DB Schema name 'USER': '', #DB user 'PASSWORD': '', #DB password 'HOST': 'localhost', 'PORT': '3306', } }
$python manage.py createsuperuser
- admin siteで使うid/password を設定
- Passwordが易しすぎるのはNG!
$python manage.py runserver
- server testing
掲示板 (Model 作業)
- shop/urls.py でappのviewsとの繋ぎ
from shop import views urlpatterns = [ url('admin/', admin.site.urls), url('', views.index, name='index'), ]
- / url(初期画面)で接続したときにshopのviewsに書いているindex methodを呼ぶ
- board/views.py
from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse('Welcome to my shop!')
- viewsにindex methodを追加
- HttpResponse moduleをimport
Model - Template - Views
- Model : board/models.py
- POST classを作ってformの項目setting
from django.db import models from django.utils import timezone class Post(models.Model): author = models.CharField(max_length=20) email = models.CharField(max_length=50) title = models.CharField(max_length=50) text = models.TextField() published_date = models.DataTimeField( default = timezone.now) def publish(self): self.published_date = timezone.now() self.save() def __str__(self): return self.title
$python manage.py makemigrations board
- DBへ反映できるようにmigration fileを用意
$python manage.py migrate board
- DBにtableが作られて内容がsaveされるようにする
adminからboardを管理できるように登録
- board/admin.py
from django.contrib import admin from .models import Post admin.site.register(Post)App内 Urls ----- Views 作業
- board/urls.py 作成
- /board/ に掲示板を表示するためのURLをsetting
from django.urls import path from . import views urlpatterns = [ path('', views.post_list, name = 'post_list'), ]
- board/views.py 作成
- 先のpost_listの定義をsetting
def post_list(request): return render(request, 'board/post_list.html', {})
- template 作業
- board/template/board forlder作成(boardはApp name)
- board/template/board/post_list.html (作成するhtml)
<html> <p>Hi there!</p> <p>Here is post_list page</p> </html>
- $python manage.py runserver でcheck!
- 投稿日:2019-03-18T01:55:41+09:00
【MySQL】MySQL入門
はじめに
環境構築はこちら
「とりあえず動作確認して学びたい!」そんな方向けのページです
データサイエンティスト育成プログラムにおいてIT講師を務めました
大文字でも小文字でも影響はない
が,SQLではなんか大文字の風潮があるので大文字で記述することにします初級編
MySQL呼び出し
(ルートなのでユーザ,パスワードなし)
$ mysql -u rootデータベース参照
mysql> SHOW DATABASES;+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+データベース作成
データベース名「chintai」を作成
mysql> CREATE DATABASE chintai;データベースが作られたか確認します.できてますね
+--------------------+ | Database | +--------------------+ | chintai | | information_schema | | mysql | | performance_schema | | sys | +--------------------+データベース選択
mysql> USE chintai;テーブル作成
データベース「chintai」に「suumo」というテーブルを作成します.
mysql> CREATE TABLE chintai. suumo(id INT(20) NOT NULL PRIMARY KEY AUTO_INCREMENT , name VARCHAR(100) , price INT(20) , toilet VARCHAR(100) , station VARCHAR(100) , type VARCHAR(100));
id name price toilet station type 説明 ID(重複なし) 物件名 家賃 トイレ・バス別(separated)か 最寄駅 木造・鉄筋コンクリ 型 INT VARCHAR INT VARCHAR VARCHAR VARCHAR ・NOT NULL PRIMARY KEY AUTO_INCREMENTをつけると,指定しなくても自動でID(INT型)が付与されます.
・カラム「ID」なしに中身を追加することはできない訳です.
・顧客のデータ管理などにおいて,異なるお客様のIDが同じIDにタグ付いたら大変なことになっちゃいますよね笑
・今はまだカラム(の名前と型)を宣言しただけで,このテーブルの中身は空っぽです.データベースに存在するテーブル一覧を参照
mysql> show tables;+-------------------+ | Tables_in_chintai | +-------------------+ | suumo | +-------------------+chintaiというデータベースの中にsuumoというテーブルが存在していることになります
テーブルの中身の追加
作ったカラムに対応したValue(中身)を追加します
mysql> INSERT INTO suumo VALUES (1,'宇都宮タワマン',75000,'S','宇都宮','RC');または
mysql> INSERT INTO suumo (id, name, price, toilet, station, type) VALUES (1,'宇都宮タワマン', 75000,'S','宇都宮','RC');テーブルの中身参照
SELECT * FROM suumo;+----+-----------------------+-------+--------+-----------+------+ | id | name | price | toilet | station | type | +----+-----------------------+-------+--------+-----------+------+ | 1 | 宇都宮タワマン | 75000 | S | 宇都宮 | RC | +----+-----------------------+-------+--------+-----------+------+・S: Separated(トイレ・バス別)
・NS: Not Separated(トイレ・バス一緒)
・RC: Reinforced Concrete(鉄筋コンクリ)
・W: Wood(木造)テーブルの削除
DROP TABLE suumo;データベースの削除
DROP DATABASE chintai;中級編
・具体例の方がわかりやすいと思うので初級編で作ったsuumo使ってやります
suumo
idとprice(家賃)のカラムのみ表示したい
mysql> SELECT id, price FROM suumo;price(家賃)の安い順に表示したい
mysql> SELECT * FROM suumo ORDER BY price;実際のSUUMOとかでも「家賃の安い順」みたいなボタン押しますよね!
あんなかんじです
今後も追加予定(2019/03)
- 投稿日:2019-03-18T01:55:41+09:00
【MySQL】MySQLに関するメモ
はじめに
環境構築はこちら
データサイエンティスト育成プログラムにおいてIT講師を務めました
大文字でも小文字でも影響はない
が,SQLではなんか大文字の風潮があるので大文字で記述することにします初級編
MySQL呼び出し
(ルートなのでユーザ,パスワードなし)
$ mysql -u rootデータベース参照
mysql> SHOW DATABASES;+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+データベース作成
データベース名「chintai」を作成
mysql> CREATE DATABASE chintai;データベースが作られたか確認します.できてますね
+--------------------+ | Database | +--------------------+ | chintai | | information_schema | | mysql | | performance_schema | | sys | +--------------------+データベース選択
mysql> USE chintai;テーブル作成
データベース「chintai」に「suumo」というテーブルを作成します.
mysql> CREATE TABLE chintai. suumo(id INT(20) NOT NULL PRIMARY KEY AUTO_INCREMENT , name VARCHAR(100) , price INT(20) , toilet VARCHAR(100) , station VARCHAR(100) , type VARCHAR(100));
id name price toilet station type 説明 ID(重複なし) 物件名 家賃 トイレ・バス別(separated)か 最寄駅 木造・鉄筋コンクリ 型 INT VARCHAR INT VARCHAR VARCHAR VARCHAR ・NOT NULL PRIMARY KEY AUTO_INCREMENTをつけると,指定しなくても自動でID(INT型)が付与されます.
・カラム「ID」なしに中身を追加することはできない訳です.
・顧客のデータ管理などにおいて,異なるお客様のIDが同じIDにタグ付いたら大変なことになっちゃいますよね笑
・今はまだカラム(の名前と型)を宣言しただけで,このテーブルの中身は空っぽです.データベースに存在するテーブル一覧を参照
mysql> show tables;+-------------------+ | Tables_in_chintai | +-------------------+ | suumo | +-------------------+chintaiというデータベースの中にsuumoというテーブルが存在していることになります
テーブルの中身の追加
作ったカラムに対応したValue(中身)を追加します
mysql> INSERT INTO suumo VALUES (1,'宇都宮タワマン',75000,'S','宇都宮','RC');または
mysql> INSERT INTO suumo (id, name, price, toilet, station, type) VALUES (1,'宇都宮タワマン', 75000,'S','宇都宮','RC');テーブルの中身参照
SELECT * FROM suumo;+----+-----------------------+-------+--------+-----------+------+ | id | name | price | toilet | station | type | +----+-----------------------+-------+--------+-----------+------+ | 1 | 宇都宮タワマン | 75000 | S | 宇都宮 | RC | +----+-----------------------+-------+--------+-----------+------+・S: Separated(トイレ・バス別)
・NS: Not Separated(トイレ・バス一緒)
・RC: Reinforced Concrete(鉄筋コンクリ)
・W: Wood(木造)テーブルの削除
DROP TABLE suumo;データベースの削除
DROP DATABASE chintai;中級編
・具体例の方がわかりやすいと思うので初級編で作ったsuumo使ってやります
suumo
idとprice(家賃)のカラムのみ表示したい
mysql> SELECT id, price FROM suumo;price(家賃)の安い順に表示したい
mysql> SELECT * FROM suumo ORDER BY price;
- 投稿日:2019-03-18T00:17:58+09:00
【初心者向け入門】PHPからMySQLを利用する
1. はじめに
PHPからMySQLへ接続し,ブラウザ上にデータベースの内容を表示する.
例として,商品表を扱う.前提条件
- MAMPが起動済み(PHPとMySQLの利用が可能である)
- データベース
test
が作成済み- テーブル
shouhin
が作成済み- サーバは
localhost
とする- MySQLのユーザ名とパスワードはともに
root
とする(mampのMySQLにおけるデフォルトのもの)PHPでのエラーチェック
PHPでエラーが発生した際にブラウザ画面に表示する関数を記載しておく.
ただし,表示されないエラーもあるため注意すること.<?php ini_set('display_errors',1); ?>参考
2. 内容
2.1. データ
テーブル
shouhin
には以下のデータが登録されている.
列num
と列hinmei
はTEXT型,列kakaku
はINTEGER型である.
num hinmei kakaku 010 pc 80000 011 display 35000 020 printer 25000 025 keyboard 1000 030 mouse 3000 2.2. ソースコード
2.2.1. 先頭1行目のデータを表示
showtable.php<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>商品表</title> <style></style> </head> <body> <?php //MySQLのデータベースサーバへ接続(サーバ名,接続ユーザ名,パスワード,データベース名 の順に指定) $link=mysqli_connect("localhost","root","root","test"); //SQL文を指定 $query="SELECT * FROM shouhin"; //PHPからSQL文を実行(接続名 $link に対して $query のSQL文を実行) //結果は$resultに格納される $result=mysqli_query($link,$query); //$result から1行取り出して,1項目ごとに配列 $row (フィールド名をキーとした連想配列)に格納 $row=mysqli_fetch_assoc($result); //$row 配列の中身を表示 echo "番号:".$row['num']."<br>"; echo "品名:".$row['hinmei']."<br>"; echo "価格:".$row['kakaku']."<br>"; ?> </body> </html>2.2.2. 全データを表示
showtable.php<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>商品表</title> <style> table,th,td { border-collapse:collapse; border:1px solid black; line-height:1.5; } </style> </head> <body> <h1>商品表</h1> <?php $link=mysqli_connect("localhost","root","root","test"); $query="SELECT * FROM shouhin"; $result=mysqli_query($link,$query); echo "<table>"; echo "<tr bgcolor=#87cefa> <th>番号</th> <th>品名</th> <th>価格</th> </tr>"; while($row=mysqli_fetch_assoc($result)){ echo "<tr> <td>{$row['num']}</td> <td>{$row['hinmei']}</td> <td>{$row['kakaku']}</td> </tr>"; } echo "</table>"; ?> </body> </html>※関数は
mysql_・・・
ではなくmysqli_・・・
であることに注意
※本来はtry-catch
文で例外(MySQLへ正常に接続できなかった場合)を考慮するが,分かりやすくするためにあえて例外を考慮しない
※区別しやすくするためにあえて字下げしている.タグごとにecho
文で分けても良い.全てを1つの
echo
文にまとめた例と分けた時の例を下に示す.どちらも同じ意味を持つ.<?php echo "<div><p>あいうえお</p></div>"; ?><?php echo "<div>"; echo "<p>"; echo "あいうえお"; echo "</p>"; echo "</div>"; ?>3. おわりに
さらに,
- データ登録画面
- データ削除画面
- データ更新(編集)画面
hinmei
やkakaku
の絞り込み検索機能(表示画面に追加)などがあると便利ですね.気が向いたら記事を作成します.
プログラムは既に作成してあるんですけどね・・・.
- 投稿日:2019-03-18T00:17:58+09:00
PHPからMySQLを利用する
1. はじめに
PHPからMySQLへ接続し,ブラウザ上にデータベースの内容を表示する.
例として,商品表を扱う.前提条件
- MAMPが起動済み(PHPとMySQLの利用が可能である)
- データベース
test
が作成済み- テーブル
shouhin
が作成済み- サーバは
localhost
とする- MySQLのユーザ名とパスワードはともに
root
とする(mampのMySQLにおけるデフォルトのもの)PHPでのエラーチェック
PHPでエラーが発生した際にブラウザ画面に表示する関数を記載しておく.
ただし,表示されないエラーもあるため注意すること.<?php ini_set('display_errors',1); ?>参考
2. 内容
2.1. データ
テーブル
shouhin
には以下のデータが登録されている.
列num
と列hinmei
はTEXT型,列kakaku
はINTEGER型である.
num hinmei kakaku 010 pc 80000 011 display 35000 020 printer 25000 025 keyboard 1000 030 mouse 3000 2.2. ソースコード
2.2.1. 先頭1行目のデータを表示
showtable.php<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>商品表</title> <style></style> </head> <body> <?php //MySQLのデータベースサーバへ接続(サーバ名,接続ユーザ名,パスワード,データベース名 の順に指定) $link=mysqli_connect("localhost","root","root","test"); //SQL文を指定 $query="SELECT * FROM shouhin"; //PHPからSQL文を実行(接続名 $link に対して $query のSQL文を実行) //結果は$resultに格納される $result=mysqli_query($link,$query); //$result から1行取り出して,1項目ごとに配列 $row (フィールド名をキーとした連想配列)に格納 $row=mysqli_fetch_assoc($result); //$row 配列の中身を表示 echo "番号:".$row['num']."<br>"; echo "品名:".$row['hinmei']."<br>"; echo "価格:".$row['kakaku']."<br>"; ?> </body> </html>2.2.2. 全データを表示
showtable.php<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>商品表</title> <style> table,th,td { border-collapse:collapse; border:1px solid black; line-height:1.5; } </style> </head> <body> <h1>商品表</h1> <?php $link=mysqli_connect("localhost","root","root","test"); $query="SELECT * FROM shouhin"; $result=mysqli_query($link,$query); echo "<table>"; echo "<tr bgcolor=#87cefa> <th>番号</th> <th>品名</th> <th>価格</th> </tr>"; while($row=mysqli_fetch_assoc($result)){ echo "<tr> <td>{$row['num']}</td> <td>{$row['hinmei']}</td> <td>{$row['kakaku']}</td> </tr>"; } echo "</table>"; ?> </body> </html>※関数は
mysql_・・・
ではなくmysqli_・・・
であることに注意
※本来はtry-catch
文で例外(MySQLへ正常に接続できなかった場合)を考慮するが,分かりやすくするためにあえて例外を考慮しない
※区別しやすくするためにあえて字下げしている.タグごとにecho
文で分けても良い.全てを1つの
echo
文にまとめた例と分けた時の例を下に示す.どちらも同じ意味を持つ.<?php echo "<div><p>あいうえお</p></div>"; ?><?php echo "<div>"; echo "<p>"; echo "あいうえお"; echo "</p>"; echo "</div>"; ?>3. おわりに
さらに,
- データ登録画面
- データ削除画面
- データ更新(編集)画面
hinmei
やkakaku
の絞り込み検索機能(表示画面に追加)などがあると便利ですね.気が向いたら記事を作成します.
プログラムは既に作成してあるんですけどね・・・.
- 投稿日:2019-03-18T00:10:46+09:00
VaporとMySQLの接続時に出たエラーの解消法
1. はじめに
VaporとMySQLの接続方法については以下の記事、サイトを参照しました。
Tutorial: How to use MySQL
VaporとMySQLを接続する。その1
VaporとMySQLを接続する。その2
Vapor公式ドキュメント環境は以下の通り
MySQL: 8.0.15
Swift: 4.2.1
Xcode: 10.1
Vapor Toolbox: 3.1.10
Vapor Framework: 3.2.22. エラー
stackoverflowの投稿を参照。
引用
From MySQL 8 if you want to use it on localhost (unsecured connection) then you need to disable the MySQL transport layer security. Use unverifiedTLS for transport in MySQLDatabaseConfig initializer.訳
MySQL8からlocalhost(安全ではない接続)でそれを使う場合、TLS(Transport Layer Security)を無効化する必要がある。MySQLDatabaseConfigを初期化しトランスポートにunverifiedTLSを使用する。TLS:暗号鍵を使いデータを暗号化し、メッセージ認証コードを使用し改ざんを検出し、デジタル署名で正当な相手との通信をする
unverifiedTLS:TLS(Ver1.1)のミニマムバージョンを必要とするTLSを有効にするが、証明書検証を無効にする。日本語訳が若干怪しいですが、まとめるとMySQLの直近Verでlocalhostを利用する場合、セキュリティの設定を変更する必要があるみたいです。
セキュリティが脆弱化すると思われますがローカル環境でやる分には大丈夫でしょう。
解決方法は以下の通り。configure.swiftにtransport: MySQLTransportConfig.unverifiedTLS を追加
<configure.swift> let mysql = MySQLDatabase(config: MySQLDatabaseConfig( hostname: "localhost", port: 3306, username: "root", password: "******", database: "database", transport: MySQLTransportConfig.unverifiedTLS ))