- 投稿日:2021-05-16T22:07:40+09:00
店舗リストから全文検索機能を使って検索ワードになるべく一致する店舗名を上位にする
概要 N-gramを使用した全文検索で検索ワードに近い結果を上位表示させる要件があったので試してみました。 準備 今回は実際に存在するような大量のデータ量で試したかったので日本全国のコンビニの店舗リストを購入しました。 (セブンイレブン、ローソン、ファミリーマートの3ブランドで総データ数は4万件程度でした) DB定義 店舗データを投入する器になるテーブルを作成しました。 -- テーブル作成 CREATE TABLE shops ( id SERIAL PRIMARY KEY COMMENT 'ID', brand VARCHAR(256) COMMENT 'ブランド名', shopname VARCHAR(256) COMMENT '店舗名', address VARCHAR(512) COMMENT '住所', telephone VARCHAR(32) COMMENT '電話番号', business_hours VARCHAR(128) COMMENT '営業時間', service VARCHAR(512) COMMENT 'サービス' ) CHARACTER SET utf8 COLLATE utf8_unicode_ci COMMENT '店舗リスト'; -- 追加でN-gramの検索インデックスを設定 ALTER TABLE shops ADD FULLTEXT INDEX shopname_fulltxt (shopname) WITH PARSER `ngram`; -- 店舗名 ALTER TABLE shops ADD FULLTEXT INDEX address_fulltxt (address) WITH PARSER `ngram`; -- 住所 ALTER TABLE shops ADD FULLTEXT INDEX service_fulltxt (service) WITH PARSER `ngram`; -- サービス 実データ準備 購入したデータを作ったテーブルに合わせて整形します。 投入用データSQLファイルを作成します。 (ファイルが10MB超えてくると投入時にエラーが出やすいので適宜分割がおすすめ) 投入用データ.sql insert into shops( brand,shopname,address,telephone,business_hours,service ) values ("セブンイレブン","豊洲","江東区豊洲4−6−1","03-3533-2241","24時間営業","ATM|Tax Free|お酒|たばこ|クリーニング|セブンカフェ|セブンスポット(無料WiFi)|セブンミール|ドーナツ|マルチコピー機|揚げ物惣菜") ,("セブンイレブン","梅田","東京都足立区梅田7丁目16番3号","03-3840-2477","24時間営業","ATM|お酒|たばこ|セブンカフェ|セブンスポット(無料WiFi)|セブンミール|ドーナツ|マルチコピー機|揚げ物惣菜") ,("セブンイレブン","希望ケ丘","福島県郡山市希望ヶ丘5−2","024-951-0275","24時間営業","ATM|お酒|たばこ|セブンカフェ|セブンスポット(無料WiFi)|セブンミール|ドーナツ|マルチコピー機|揚げ物惣菜") -- 中略(データ数4万件弱) ,("ファミリーマート","古川鶴ヶ埣店","宮城県大崎市古川鶴ヶ埣字鶴田 164番地1","0229-91-0023","24時間","Alipay |E-net ATM|FamiPay|Famiポート|J-Coin Pay|LINE Pay|PayPay|QUICPay|Tマネー|WAON|WeChat Pay|Wi-Fi|au Pay|d払い|iD|お酒|たばこ|ゆうちょPay|イートイン|コピー・FAX|ユニコ|交通系電子マネー|楽天Edy|楽天Pay|駐車場") ,("ファミリーマート","気仙沼四反田店","宮城県気仙沼市四反田23-11","0226-25-3668","24時間","Alipay |E-net ATM|FamiPay|Famiポート|J-Coin Pay|LINE Pay|PayPay|QUICPay|Tマネー|WAON|WeChat Pay|Wi-Fi|au Pay|d払い|iD|お酒|たばこ|ゆうちょPay|コピー・FAX|ユニコ|交通系電子マネー|楽天Edy|楽天Pay|証明写真|駐車場") ,("ファミリーマート","天童貫津店","山形県天童市桜町2-16","023-652-1920","24時間","Alipay |E-net ATM|FamiPay|Famiポート|J-Coin Pay|LINE Pay|PayPay|QUICPay|Tマネー|WAON|WeChat Pay|Wi-Fi|au Pay|d払い|iD|お酒|たばこ|ゆうちょPay|コピー・FAX|ユニコ|交通系電子マネー|楽天Edy|楽天Pay|駐車場"); 投入したらレコード件数がデータ数と一致するかチェックします。 (データ投入が漏れてる時もあるのでこういった確認は結構重要です) select count(*) from shops; 実践 shopnameカラムで「西船橋駅南口」を検索することにしました。 完全一致で検索 1件のみ引っかかかりました。 select * from shops where shopname = '西船橋駅南口'; 全文検索で検索 652件引っかかりました。関係なさそうな店名も引っかかってますがよく見るとN-gramの規則に当てはまる値がちゃんとでてきています。 select * from shops where MATCH (shopname) AGAINST ('西船橋駅南口'); 全文検索のMATCH~AGAINSTのスコア(数値)を表示 MATCH~AGAINSTの実態は数値らしいです。この数値が0だとwhere条件で指定されていると除外されるみたいです。 select MATCH (shopname) AGAINST ('西船橋駅南口') as score, shops.* from shops limit 20; スコアが小さい順に並べてみる 「須坂駅南店」と「西船橋駅南口」は「駅南」が共通点ですが結構かけはなれていますね。 select MATCH (shopname) AGAINST ('西船橋駅南口') as score, shops.* from shops where MATCH (shopname) AGAINST ('西船橋駅南口') order by score asc; スコアが大きい順に並べてみる お目当ての「西船橋駅南口」が一番上に来ていますね。上位も船橋っぽい店舗が少し引っかかっています。 select MATCH (shopname) AGAINST ('西船橋駅南口') as score, shops.* from shops where MATCH (shopname) AGAINST ('西船橋駅南口') order by score desc; まとめ MATCH~AGAINSTのスコアの数値を降順にすると一致したものが上位に出やすくなるので活用しましょう。 参考記事・サイト 付録 折角なのでスコアが大きい順に並べてみるの検索結果をスコア付きで全件載せておきます。 意外にも人間の感覚だと名前が近そうに感じる船橋の店舗が200位くらいに固まってる現象が起きてるのが面白いです。 検索順位 score brand shopname 1 36.76387024 セブンイレブン 西船橋駅南口 2 23.05332184 セブンイレブン 船橋駅南口 3 19.61122131 ローソン ローソン 船橋西船二丁目 4 19.61122131 ローソン ローソン 船橋西船六丁目 5 17.15264511 セブンイレブン 福岡大橋駅南口 6 13.71054363 セブンイレブン 西船 7 13.71054363 セブンイレブン 筑西船玉 8 13.71054363 セブンイレブン 柴田西船迫1丁目 9 13.71054363 ローソン ローソン 柴田西船迫 10 13.71054363 ファミリーマート 西船四丁目店 11 13.71054363 ファミリーマート 北葛西船堀通り店 12 13.00712109 セブンイレブン 世田谷千歳船橋駅北 13 13.00712109 ローソン ローソンストア100 東船橋駅北口 14 13.00712109 ローソン ローソンストア100 東船橋駅前 15 13.00712109 ファミリーマート 京成船橋駅上りホーム店 16 13.00712109 ファミリーマート 京成船橋駅下りホーム店 17 13.00712109 ファミリーマート 船橋駅東店 18 13.00712109 ファミリーマート JR船橋駅前店 19 11.56054878 セブンイレブン 行橋駅南 20 11.56054878 ローソン ローソン S OSL肥後橋駅南 21 11.56054878 ファミリーマート 長堀橋駅南店 22 11.56054878 ファミリーマート 阿部野橋駅南店 23 11.56054878 ファミリーマート 古川橋駅南店 24 10.04620171 セブンイレブン 東川口駅南口 25 10.04620171 セブンイレブン 八王子高尾駅南口 26 10.04620171 セブンイレブン 春日井勝川駅南口 27 10.04620171 セブンイレブン ハートインJR弁天町駅南口 28 10.04620171 セブンイレブン 下北沢駅南口 29 10.04620171 セブンイレブン 昭島駅南口 30 10.04620171 セブンイレブン 阪急夙川駅南口 31 10.04620171 セブンイレブン 熊谷駅南口 32 10.04620171 セブンイレブン 名古屋金山駅南口 33 10.04620171 セブンイレブン 清瀬駅南口 34 10.04620171 セブンイレブン 相模原淵野辺駅南口 35 10.04620171 セブンイレブン 寺田町駅南口 36 10.04620171 セブンイレブン 朝霞台駅南口 37 10.04620171 セブンイレブン 静岡駅南口 38 10.04620171 セブンイレブン 明石大久保駅南口 39 10.04620171 セブンイレブン JR王寺駅南口 40 10.04620171 セブンイレブン 拝島駅南口 41 10.04620171 セブンイレブン 堺中百舌鳥駅南口 42 10.04620171 セブンイレブン 小平花小金井駅南口 43 10.04620171 セブンイレブン 大泉学園駅南口 44 10.04620171 セブンイレブン 市川本八幡駅南口 45 10.04620171 セブンイレブン 武蔵野台駅南口 46 10.04620171 セブンイレブン 名古屋本山駅南口 47 10.04620171 セブンイレブン 阿佐谷駅南口 48 10.04620171 セブンイレブン 田無駅南口 49 10.04620171 セブンイレブン 川越南大塚駅南口 50 10.04620171 セブンイレブン 新座駅南口 51 10.04620171 セブンイレブン 浦安駅南口 52 10.04620171 セブンイレブン 西八王子駅南口 53 10.04620171 セブンイレブン 藤代駅南口 54 10.04620171 セブンイレブン 青梅河辺駅南口 55 10.04620171 セブンイレブン 新横浜駅南口 56 10.04620171 セブンイレブン 西千葉駅南口 57 10.04620171 セブンイレブン 市川駅南口 58 10.04620171 セブンイレブン 森林公園駅南口 59 10.04620171 セブンイレブン 錦糸町駅南口 60 10.04620171 セブンイレブン 近鉄大和八木駅南口 61 10.04620171 セブンイレブン 下館駅南口 62 10.04620171 セブンイレブン 志木駅南口 63 10.04620171 セブンイレブン 柏駅南口 64 10.04620171 セブンイレブン 立川駅南口 65 10.04620171 セブンイレブン 川崎溝の口駅南口 66 10.04620171 セブンイレブン 小手指駅南口 67 10.04620171 セブンイレブン いわき駅南口 68 10.04620171 セブンイレブン ハートインJR福山駅南口 69 10.04620171 セブンイレブン 西国分寺駅南口 70 10.04620171 セブンイレブン ハートインJR西条駅南口 71 10.04620171 セブンイレブン 新宿大久保駅南口 72 10.04620171 セブンイレブン 八街駅南口 73 10.04620171 セブンイレブン ハートインJR倉敷駅南口 74 10.04620171 セブンイレブン 神田駅南口 75 10.04620171 セブンイレブン ハートインJR野洲駅南口 76 10.04620171 セブンイレブン 朝霞駅南口 77 10.04620171 セブンイレブン ハートインJR石山駅南口 78 10.04620171 セブンイレブン 横浜中山駅南口 79 10.04620171 セブンイレブン キヨスクJR甲子園口駅南口 80 10.04620171 セブンイレブン 水戸駅南口 81 10.04620171 セブンイレブン 京王稲田堤駅南口 82 10.04620171 セブンイレブン 町田成瀬駅南口 83 10.04620171 セブンイレブン ハートインJR桃谷駅南口 84 10.04620171 セブンイレブン ハートインJR加古川駅南口 85 10.04620171 セブンイレブン ハートインJR三田駅南口 86 10.04620171 セブンイレブン ハートインJR桜井駅南口 87 10.04620171 セブンイレブン 葛飾亀有駅南口 88 10.04620171 セブンイレブン 東伏見駅南口 89 10.04620171 セブンイレブン 加須駅南口 90 10.04620171 セブンイレブン ハートインJR法隆寺駅南口 91 10.04620171 セブンイレブン ハートインJR新大阪駅南口 92 10.04620171 セブンイレブン 二宮駅南口 93 10.04620171 セブンイレブン ハートイン京都地下鉄京都駅南口 94 10.04620171 セブンイレブン ハートインJR姫路駅南口 95 10.04620171 ローソン ローソン 麻生駅南口 96 10.04620171 ローソン ローソン ひばり草薙駅南口 97 10.04620171 ローソン ローソン 平塚駅南口 98 10.04620171 ローソン ローソン 藤沢駅南口 99 10.04620171 ローソン ローソン JR三鷹駅南口 100 10.04620171 ローソン ローソン JR立川駅南口 101 10.04620171 ローソン ローソン H府中駅南口 102 10.04620171 ローソン ローソンストア100 赤羽駅南口 103 10.04620171 ローソン ローソン 向ヶ丘遊園駅南口 104 10.04620171 ローソン ローソン S大垣駅南口 105 10.04620171 ローソン ローソン 太田駅南口 106 10.04620171 ローソン ローソン 浦安駅南口 107 10.04620171 ローソン ローソンストア100 生田駅南口 108 10.04620171 ローソン ローソン 中津駅南口 109 10.04620171 ローソン ローソン 茅ヶ崎駅南口 110 10.04620171 ローソン ローソン 野幌駅南口 111 10.04620171 ローソン ローソン 小倉駅南口 112 10.04620171 ローソン ローソン 阿佐ヶ谷駅南口 113 10.04620171 ローソン ローソン 国立駅南口 114 10.04620171 ローソン ローソン 三島駅南口 115 10.04620171 ローソン ローソン 西葛西駅南口 116 10.04620171 ローソン ローソン 祖師ヶ谷大蔵駅南口 117 10.04620171 ローソン ローソン 柏駅南口 118 10.04620171 ローソン ローソン たまプラーザ駅南口 119 10.04620171 ローソン ローソン 西鉄福岡天神駅南口 120 10.04620171 ローソン ローソン 津田沼駅南口 121 10.04620171 ローソン ローソン 清瀬秋津駅南口 122 10.04620171 ローソン ローソン 沼津駅南口 123 10.04620171 ローソン ローソン 荻窪駅南口 124 10.04620171 ローソン ローソン 大塚駅南口 125 10.04620171 ローソン ローソン 江坂駅南口 126 10.04620171 ローソン ローソン 越谷レイクタウン駅南口 127 10.04620171 ローソン ローソン 御徒町駅南口 128 10.04620171 ローソン ローソンストア100 柴崎駅南口 129 10.04620171 ローソン ローソン 府中西府駅南口 130 10.04620171 ローソン ローソン 西千葉駅南口 131 10.04620171 ローソン ローソン 調布駅南口 132 10.04620171 ローソン ローソン 新青森駅南口 133 10.04620171 ローソン ローソン 飛田給駅南口 134 10.04620171 ローソン ローソン 東三国駅南口 135 10.04620171 ファミリーマート 佐賀駅南口店 136 10.04620171 ファミリーマート 桜上水駅南口店 137 10.04620171 ファミリーマート 江古田駅南口店 138 10.04620171 ファミリーマート 相武台前駅南口店 139 10.04620171 ファミリーマート 志木駅南口店 140 10.04620171 ファミリーマート 本厚木駅南口店 141 10.04620171 ファミリーマート 吉祥寺駅南口店 142 10.04620171 ファミリーマート 藤が丘駅南口店 143 10.04620171 ファミリーマート 篠崎駅南口店 144 10.04620171 ファミリーマート 平井駅南口店 145 10.04620171 ファミリーマート 丸萬清瀬駅南口店 146 10.04620171 ファミリーマート 中野駅南口本通り店 147 10.04620171 ファミリーマート 三ツ境駅南口店 148 10.04620171 ファミリーマート 新小岩駅南口店 149 10.04620171 ファミリーマート 国立駅南口店 150 10.04620171 ファミリーマート 小田急町田駅南口店 151 10.04620171 ファミリーマート 東岡崎駅南口店 152 10.04620171 ファミリーマート 下総中山駅南口店 153 10.04620171 ファミリーマート 町田駅南口店 154 10.04620171 ファミリーマート 日進駅南口店 155 10.04620171 ファミリーマート 王子駅南口店 156 10.04620171 ファミリーマート 淵野辺駅南口店 157 10.04620171 ファミリーマート 三軒茶屋駅南口店 158 10.04620171 ファミリーマート 百合ヶ丘駅南口店 159 10.04620171 ファミリーマート 玉川上水駅南口店 160 10.04620171 ファミリーマート 北小金駅南口店 161 10.04620171 ファミリーマート 北野駅南口店 162 10.04620171 ファミリーマート 保谷駅南口店 163 10.04620171 ファミリーマート 日野豊田駅南口店 164 10.04620171 ファミリーマート 本厚木駅南口ロータリー前店 165 10.04620171 ファミリーマート JR宇治駅南口店 166 10.04620171 ファミリーマート 磐田駅南口店 167 10.04620171 ファミリーマート 刈谷駅南口店 168 10.04620171 ファミリーマート 大塚駅南口店 169 10.04620171 ファミリーマート 浜松駅南口店 170 10.04620171 ファミリーマート 金山駅南口店 171 10.04620171 ファミリーマート 茅ヶ崎駅南口店 172 10.04620171 ファミリーマート 船堀駅南口店 173 7.106444359 セブンイレブン 福岡大橋駅西 174 7.106444359 セブンイレブン 西鉄大橋駅前 175 7.106444359 セブンイレブン 扇大橋駅前 176 7.106444359 セブンイレブン 東日本橋駅前 177 7.106444359 セブンイレブン 阪急石橋駅前 178 7.106444359 セブンイレブン 馬橋駅東口 179 7.106444359 セブンイレブン 京橋駅前 180 7.106444359 セブンイレブン 大月猿橋駅前 181 7.106444359 セブンイレブン 心斎橋駅前 182 7.106444359 セブンイレブン 大阪肥後橋駅前 183 7.106444359 セブンイレブン 新宿曙橋駅西 184 7.106444359 セブンイレブン 大阪鶴橋駅西 185 7.106444359 セブンイレブン 豊橋駅東 186 7.106444359 セブンイレブン 大阪西大橋駅前 187 7.106444359 セブンイレブン 横浜平沼橋駅前 188 7.106444359 セブンイレブン 大阪日本橋駅前 189 7.106444359 セブンイレブン 京都丹波橋駅西 190 7.106444359 セブンイレブン 大阪日本橋駅東 191 7.106444359 セブンイレブン 下板橋駅前 192 7.106444359 セブンイレブン 仙台五橋駅前 193 7.106444359 セブンイレブン 千鳥橋駅前 194 7.106444359 セブンイレブン 飯田橋駅北 195 7.106444359 セブンイレブン 中板橋駅前通り 196 7.106444359 セブンイレブン 浅草橋駅東口 197 7.106444359 セブンイレブン 浅草橋駅西口 198 7.106444359 セブンイレブン 新宿曙橋駅東 199 7.106444359 セブンイレブン 練馬中村橋駅北 200 7.106444359 セブンイレブン ハートインJR京橋駅1番のりば 201 7.106444359 セブンイレブン キヨスクJR京橋駅西口 202 7.106444359 セブンイレブン 千住大橋駅 203 7.106444359 セブンイレブン 馬橋駅西口 204 7.106444359 セブンイレブン 新橋駅前 205 7.106444359 セブンイレブン ハートインJR鶴橋駅1番のりば 206 7.106444359 セブンイレブン 上板橋駅前 207 7.106444359 セブンイレブン キヨスクJR鶴橋駅中央改札口 208 7.106444359 ローソン ローソン 福岡大橋駅前 209 7.106444359 ローソン ローソン 近鉄江戸橋駅前 210 7.106444359 ローソン ローソンストア100 鶴橋駅前 211 7.106444359 ローソン ローソンストア100 緑橋駅前 212 7.106444359 ローソン ローソン 板橋駅東口 213 7.106444359 ローソン ローソンストア100 馬橋駅東口 214 7.106444359 ローソン ローソン S OSL長堀橋駅 215 7.106444359 ローソン ローソン S OSL心斎橋駅北2号 216 7.106444359 ローソン ローソン S OSL日本橋駅 217 7.106444359 ローソン ローソン 江戸川橋駅前 218 7.106444359 ローソン ローソン S OSL天満橋駅 219 7.106444359 ローソン ローソン S OSL肥後橋駅北 220 7.106444359 ローソン ローソン S OSL淀屋橋駅北 221 7.106444359 ローソン ローソン S OSL心斎橋駅北1号 222 7.106444359 ローソン ローソン 鶴橋駅前 223 7.106444359 ローソン ローソン 代田橋駅北口 224 7.106444359 ローソン ローソン 浅草橋駅前 225 7.106444359 ローソン ローソン 京橋駅前 226 7.106444359 ローソン ローソン 都営水道橋駅前 227 7.106444359 ローソン ローソン 西鉄大橋駅 228 7.106444359 ローソン ローソン 豊橋駅前 229 7.106444359 ローソン ローソン 旭橋駅前 230 7.106444359 ローソン ローソン 肥後橋駅前 231 7.106444359 ローソン ローソン 阪急石橋駅前 232 7.106444359 ファミリーマート 板橋駅西口店 233 7.106444359 ファミリーマート 都営線曙橋駅店 234 7.106444359 ファミリーマート 新橋駅西店 235 7.106444359 ファミリーマート 都営浅草橋駅前店 236 7.106444359 ファミリーマート 板橋駅桜通り店 237 7.106444359 ファミリーマート 豊田土橋駅前店 238 7.106444359 ファミリーマート 千鳥橋駅前店 239 7.106444359 ファミリーマート 江戸川橋駅西店 240 7.106444359 ファミリーマート 新豊橋駅店 241 7.106444359 ファミリーマート 京橋駅西店 242 7.106444359 ファミリーマート 鶴橋駅前店 243 7.106444359 ファミリーマート 長堀橋駅北店 244 7.106444359 ファミリーマート 心斎橋駅前店 245 7.106444359 ファミリーマート 石橋駅東店 246 7.106444359 ファミリーマート 近鉄阿部野橋駅西改札内店 247 7.106444359 ファミリーマート 近鉄阿部野橋駅地下中改札内店 248 7.106444359 ファミリーマート 深江橋駅前店 249 7.106444359 ファミリーマート 鶴橋駅北店 250 7.106444359 ファミリーマート 薬ヒグチJR京橋駅東店 251 7.106444359 ファミリーマート 京橋駅北口店 252 7.106444359 ファミリーマート メトロ新橋駅店 253 7.106444359 ファミリーマート 朝潮橋駅前店 254 7.106444359 ファミリーマート 豊橋駅東口店 255 7.106444359 ファミリーマート 浅草橋駅東口店 256 5.900676727 セブンイレブン 船橋宮本 257 5.900676727 セブンイレブン 船橋松が丘4丁目 258 5.900676727 セブンイレブン 船橋高根町 259 5.900676727 セブンイレブン 船橋夏見1丁目 260 5.900676727 セブンイレブン 船橋西習志野4丁目 261 5.900676727 セブンイレブン 世田谷船橋7丁目 262 5.900676727 セブンイレブン 船橋本郷町 263 5.900676727 セブンイレブン 船橋葛飾2丁目 264 5.900676727 セブンイレブン 五所川原姥萢船橋 265 5.900676727 セブンイレブン 船橋二和東6丁目 266 5.900676727 セブンイレブン 船橋古作3丁目 267 5.900676727 セブンイレブン 船橋藤原3丁目 268 5.900676727 セブンイレブン 船橋北習志野駅前 269 5.900676727 セブンイレブン 船橋湊町 270 5.900676727 セブンイレブン 船橋本中山3丁目 271 5.900676727 セブンイレブン 船橋印内町 272 5.900676727 セブンイレブン 船橋滝不動駅前 273 5.900676727 セブンイレブン ビビット南船橋 274 5.900676727 セブンイレブン 船橋習志野台4丁目 275 5.900676727 セブンイレブン 船橋三山7丁目 276 5.900676727 セブンイレブン 船橋海神町南 277 5.900676727 セブンイレブン 船橋本町4丁目 278 5.900676727 セブンイレブン 船橋二和東5丁目 279 5.900676727 セブンイレブン 船橋芝山6丁目 280 5.900676727 セブンイレブン 船橋本町 281 5.900676727 セブンイレブン 稲沢船橋町 282 5.900676727 セブンイレブン 東船橋4丁目 283 5.900676727 セブンイレブン 船橋アンデルセン公園前 284 5.900676727 セブンイレブン 船橋新高根6丁目 285 5.900676727 セブンイレブン 船橋宮本3丁目 286 5.900676727 セブンイレブン 東船橋2丁目 287 5.900676727 セブンイレブン 船橋山手 288 5.900676727 セブンイレブン 船橋夏見町2丁目 289 5.900676727 セブンイレブン 船橋山野町 290 5.900676727 セブンイレブン 船橋塚田駅前 291 5.900676727 セブンイレブン 船橋本中山6丁目 292 5.900676727 セブンイレブン 小田急千歳船橋 293 5.900676727 セブンイレブン 船橋市場 294 5.900676727 セブンイレブン 船橋前原東4丁目 295 5.900676727 セブンイレブン 船橋坪井東4丁目 296 5.900676727 セブンイレブン 船橋市役所前 297 5.900676727 セブンイレブン 船橋習志野1丁目 298 5.900676727 セブンイレブン 船橋駿河台1丁目 299 5.900676727 セブンイレブン 船橋夏見台 300 5.900676727 セブンイレブン 船橋北本町2丁目 301 5.900676727 セブンイレブン 船橋本中山2丁目 302 5.900676727 セブンイレブン 船橋前原西2丁目 303 5.900676727 セブンイレブン 船橋前原西6丁目 304 5.900676727 セブンイレブン 船橋薬円台駅前 305 5.900676727 セブンイレブン 船橋本町7丁目 306 5.900676727 セブンイレブン 船橋行田町北 307 5.900676727 セブンイレブン 船橋二和向台駅前 308 5.900676727 セブンイレブン 船橋潮見町 309 5.900676727 セブンイレブン 船橋栄町 310 5.900676727 セブンイレブン 枚方東船橋 311 5.900676727 セブンイレブン 世田谷船橋6丁目 312 5.900676727 セブンイレブン 船橋習志野4丁目 313 5.900676727 セブンイレブン 東船橋5丁目 314 5.900676727 セブンイレブン 船橋飯山満町2丁目 315 5.900676727 セブンイレブン 船橋日の出2丁目 316 5.900676727 セブンイレブン 船橋薬円台2丁目 317 5.900676727 セブンイレブン 船橋前原西 318 5.900676727 セブンイレブン 東船橋1丁目 319 5.900676727 セブンイレブン 世田谷船橋希望ヶ丘通り 320 5.900676727 セブンイレブン 船橋南海神1丁目 321 5.900676727 セブンイレブン 船橋習志野台7丁目 322 5.900676727 セブンイレブン 枚方船橋本町 323 5.900676727 セブンイレブン 船橋坪井町 324 5.900676727 セブンイレブン 船橋二和東 325 5.900676727 セブンイレブン 船橋若松1丁目 326 5.900676727 セブンイレブン 船橋海神5丁目 327 5.900676727 セブンイレブン 船橋本町1丁目 328 5.900676727 セブンイレブン 船橋馬込沢 329 5.900676727 セブンイレブン 船橋薬円台公園前 330 5.900676727 セブンイレブン 船橋夏見西 331 5.900676727 セブンイレブン 船橋本町2丁目 332 5.900676727 セブンイレブン 船橋高根台 333 5.900676727 セブンイレブン 船橋田喜野井4丁目 334 5.900676727 ローソン ローソン 船橋藤原七丁目 335 5.900676727 ローソン ローソンストア100 船橋本町六丁目 336 5.900676727 ローソン ローソン 船橋市役所前 337 5.900676727 ローソン ローソン 船橋丸山一丁目 338 5.900676727 ローソン ローソンストア100 世田谷船橋一丁目 339 5.900676727 ローソン ローソンストア100 船橋大神宮 340 5.900676727 ローソン ローソン 船橋東中山二丁目 341 5.900676727 ローソン ローソン LTF船橋咲が丘 342 5.900676727 ローソン ローソン LTF船橋旭町 343 5.900676727 ローソン ローソン LTF船橋大穴南三丁目 344 5.900676727 ローソン ローソン MFLP船橋 345 5.900676727 ローソン ローソン LTF船橋本中山 346 5.900676727 ローソン ローソン LTF船橋習志野台 347 5.900676727 ローソン ローソン 船橋西習志野一丁目 348 5.900676727 ローソン ローソン LTF世田谷船橋 349 5.900676727 ローソン ローソン LTF船橋夏見一丁目 350 5.900676727 ローソン ローソン 船橋本町二丁目 351 5.900676727 ローソン ローソン LTF船橋北本町 352 5.900676727 ローソン ローソン LTF船橋二和西 353 5.900676727 ローソン ローソン 東船橋二丁目 354 5.900676727 ローソン ローソン 船橋浜町二丁目 355 5.900676727 ローソン ローソン 船橋芝山 356 5.900676727 ローソン ローソン 船橋日大 357 5.900676727 ローソン ローソン 船橋二宮 358 5.900676727 ローソン ローソン 船橋飯山満町三丁目 359 5.900676727 ローソン ローソン H船橋 360 5.900676727 ローソン ローソン 船橋大穴北 361 5.900676727 ローソン ローソン 船橋豊富町 362 5.900676727 ローソン ローソン 船橋インター 363 5.900676727 ローソン ローソン 船橋上山町二丁目 364 5.900676727 ローソン ローソン 船橋薬円台一丁目 365 5.900676727 ローソン ローソン 船橋中央病院 366 5.900676727 ローソン ローソン H船橋本町四丁目 367 5.900676727 ローソン ローソン 船橋藤原 368 5.900676727 ローソン ローソン 船橋海神町二丁目 369 5.900676727 ローソン ローソン 船橋三咲四丁目 370 5.900676727 ローソン ローソン 船橋米ケ崎町 371 5.900676727 ローソン ローソン 枚方南船橋 372 5.900676727 ローソン ローソン 船橋薬円台六丁目 373 5.900676727 ローソン ローソン 船橋金杉八丁目 374 5.900676727 ローソン ローソン 船橋栄町一丁目 375 5.900676727 ローソン ローソン S MFLP船橋ゲートゾーン 376 5.900676727 ローソン ローソン 船橋二和東五丁目 377 5.900676727 ローソン ローソン 船橋埠頭 378 5.900676727 ローソン ローソン 船橋葛飾町二丁目 379 5.900676727 ローソン ローソン 船橋大神保町 380 5.900676727 ローソン ローソン 船橋塚田駅前 381 5.900676727 ローソン ローソン 枚方船橋本町二丁目 382 5.900676727 ローソン ローソン 船橋湊町一丁目 383 5.900676727 ローソン ローソン 船橋宮本 384 5.900676727 ローソン ローソン 船橋本郷町 385 5.900676727 ローソン ローソン 船橋習志野台一丁目 386 5.900676727 ローソン ローソン 船橋前原西 387 5.900676727 ローソン ローソン 枚方南船橋二丁目 388 5.900676727 ファミリーマート 船橋法典駅前店 389 5.900676727 ファミリーマート 船橋希望丘通り店 390 5.900676727 ファミリーマート 船橋駿河台店 391 5.900676727 ファミリーマート 船橋本町一丁目店 392 5.900676727 ファミリーマート 船橋習志野台四丁目店 393 5.900676727 ファミリーマート 船橋古和釜店 394 5.900676727 ファミリーマート 船橋高瀬町店 395 5.900676727 ファミリーマート 船橋金杉店 396 5.900676727 ファミリーマート 船橋実籾街道店 397 5.900676727 ファミリーマート 船橋習志野四丁目店 398 5.900676727 ファミリーマート 船橋小野田町店 399 5.900676727 ファミリーマート 船橋芝山四丁目店 400 5.900676727 ファミリーマート 船橋三山七丁目店 401 5.900676727 ファミリーマート 船橋湊町一丁目店 402 5.900676727 ファミリーマート 船橋咲が丘店 403 5.900676727 ファミリーマート 船橋印内町店 404 5.900676727 ファミリーマート 船橋南本町店 405 5.900676727 ファミリーマート 京成船橋店 406 5.900676727 ファミリーマート 船橋本町七丁目店 407 5.900676727 ファミリーマート 船橋競馬場駅店 408 5.900676727 ファミリーマート 船橋本中山店 409 5.900676727 ファミリーマート 船橋印内三丁目店 410 5.900676727 ファミリーマート 船橋習志野台五丁目店 411 5.900676727 ファミリーマート 船橋フェイスビル店 412 5.900676727 ファミリーマート 船橋湊町店 413 5.900676727 ファミリーマート 船橋日大前駅店 414 5.592096806 セブンイレブン つつじヶ丘南口 415 5.592096806 セブンイレブン 平塚南口 416 5.592096806 セブンイレブン おみやげ街道広島南口 417 5.592096806 セブンイレブン 千葉青葉の森南口 418 5.592096806 セブンイレブン 伏見桃山南口 419 5.592096806 セブンイレブン 横浜長津田南口 420 5.592096806 セブンイレブン 小田急読売ランド前南口 421 5.592096806 セブンイレブン 東小金井南口 422 5.592096806 セブンイレブン 本庄南口 423 5.592096806 セブンイレブン 宝塚南口2丁目 424 5.592096806 セブンイレブン 横浜戸塚小学校南口 425 5.592096806 セブンイレブン 高田馬場南口 426 5.592096806 セブンイレブン ハートインJR鷹取駅改札南口 427 5.592096806 セブンイレブン 川崎武蔵小杉駅新南口 428 5.592096806 セブンイレブン 品川駅港南口 429 5.592096806 セブンイレブン ハートインJR大阪駅御堂筋南口 430 5.592096806 ローソン ローソン 品川駅港南口 431 5.592096806 ローソン ローソン 京成小岩南口 432 5.592096806 ローソン ローソンストア100 拝島南口 433 5.592096806 ローソン ローソンストア100 宝塚南口駅前 434 5.592096806 ローソン ローソンストア100 浦安南口 435 5.592096806 ローソン ローソンストア100 荻窪南口 436 5.592096806 ローソン ローソンストア100 亀有南口 437 5.592096806 ローソン ローソン LTF相武台前南口 438 5.592096806 ローソン ローソン 新馬場南口 439 5.592096806 ローソン ローソン 妙典南口 440 5.592096806 ローソン ローソン 立川南口大通 441 5.592096806 ファミリーマート 国分寺南口駅前店 442 5.592096806 ファミリーマート 柳沢南口店 443 5.592096806 ファミリーマート 金町南口店 444 5.592096806 ファミリーマート 相模大野南口店 445 5.592096806 ファミリーマート 品川駅港南口店 446 5.592096806 ファミリーマート 向ケ丘遊園南口店 447 5.592096806 ファミリーマート JR八王子南口店 448 5.592096806 ファミリーマート 杉並阿佐谷南口店 449 5.592096806 ファミリーマート 和光南口店 450 5.592096806 ファミリーマート 中野南口店 451 5.592096806 ファミリーマート 中野島南口店 452 5.592096806 ファミリーマート 蒲田南口駅前店 453 5.592096806 ファミリーマート 上北沢駅前南口店 454 5.592096806 ファミリーマート 小岩南口店 455 5.592096806 ファミリーマート 武蔵新城南口店 456 5.592096806 ファミリーマート 二俣川南口店 457 5.592096806 ファミリーマート 盛岡松園南口店 458 4.454104424 セブンイレブン 名古屋東別院駅南 459 4.454104424 セブンイレブン 調布仙川駅南 460 4.454104424 セブンイレブン 江東森下駅南 461 4.454104424 セブンイレブン 春日井神領駅南 462 4.454104424 セブンイレブン 大東野崎駅南 463 4.454104424 セブンイレブン 池田駅南 464 4.454104424 セブンイレブン 港区乃木坂駅南 465 4.454104424 セブンイレブン 北松戸駅南 466 4.454104424 セブンイレブン 八王子駅南 467 4.454104424 セブンイレブン 東岩槻駅南 468 4.454104424 セブンイレブン 三田駅南 469 4.454104424 セブンイレブン 高石駅南 470 4.454104424 セブンイレブン 西荻窪駅南 471 4.454104424 セブンイレブン 福知山駅南 472 4.454104424 セブンイレブン 北区王子神谷駅南 473 4.454104424 セブンイレブン 博多駅南3丁目 474 4.454104424 セブンイレブン 大阪新深江駅南 475 4.454104424 セブンイレブン 練馬富士見台駅南 476 4.454104424 セブンイレブン 京都阪急大宮駅南 477 4.454104424 セブンイレブン 栃木駅南 478 4.454104424 セブンイレブン 石巻駅南 479 4.454104424 セブンイレブン 江古田駅南 480 4.454104424 セブンイレブン 下北沢駅南西口 481 4.454104424 セブンイレブン 福岡姪浜駅南2丁目 482 4.454104424 セブンイレブン 足立竹ノ塚駅南 483 4.454104424 セブンイレブン 紀の川粉河駅南 484 4.454104424 セブンイレブン 坂出駅南 485 4.454104424 セブンイレブン 横浜六浦駅南 486 4.454104424 セブンイレブン 柏森駅南 487 4.454104424 セブンイレブン 中野坂上駅南 488 4.454104424 セブンイレブン 江東亀戸駅南 489 4.454104424 セブンイレブン 千歳烏山駅南 490 4.454104424 セブンイレブン 名古屋今池駅南 491 4.454104424 セブンイレブン 横浜希望ヶ丘駅南 492 4.454104424 セブンイレブン 阪急武庫之荘駅南 493 4.454104424 セブンイレブン JR野田駅南 494 4.454104424 セブンイレブン 大田区池上駅南 495 4.454104424 セブンイレブン 島田駅南 496 4.454104424 セブンイレブン 高岡駅南4丁目 497 4.454104424 セブンイレブン 前原駅南2丁目 498 4.454104424 セブンイレブン 東浦和駅南 499 4.454104424 セブンイレブン 世田谷自由が丘駅南 500 4.454104424 セブンイレブン 江東木場駅南 501 4.454104424 セブンイレブン 八王子めじろ台駅南 502 4.454104424 セブンイレブン 寄居駅南 503 4.454104424 セブンイレブン 大田区大森駅南 504 4.454104424 セブンイレブン 福間駅南 505 4.454104424 セブンイレブン 湖西駅南1丁目 506 4.454104424 セブンイレブン 京成大久保駅南 507 4.454104424 セブンイレブン 近江八幡駅南 508 4.454104424 セブンイレブン 狛江駅南 509 4.454104424 セブンイレブン 八千代中央駅南 510 4.454104424 セブンイレブン 芦屋打出駅南 511 4.454104424 セブンイレブン 阪神西宮駅南 512 4.454104424 セブンイレブン 小田原鴨宮駅南 513 4.454104424 セブンイレブン 小平駅南 514 4.454104424 セブンイレブン 松戸駅南 515 4.454104424 セブンイレブン 横浜東白楽駅南 516 4.454104424 セブンイレブン 相模大野駅南 517 4.454104424 セブンイレブン 古川駅南3丁目 518 4.454104424 セブンイレブン 東大和市駅南 519 4.454104424 セブンイレブン 神戸三宮駅南 520 4.454104424 セブンイレブン 大牟田駅南 521 4.454104424 セブンイレブン 阪急塚口駅南 522 4.454104424 セブンイレブン 江戸川葛西駅南 523 4.454104424 セブンイレブン 世田谷池ノ上駅南 524 4.454104424 セブンイレブン 名古屋名駅南2丁目 525 4.454104424 セブンイレブン 西宮JR甲子園口駅南 526 4.454104424 セブンイレブン 福生牛浜駅南 527 4.454104424 セブンイレブン 博多駅南1丁目 528 4.454104424 セブンイレブン 浜松駅南 529 4.454104424 セブンイレブン 港区赤坂駅南 530 4.454104424 セブンイレブン 名古屋名駅南1丁目 531 4.454104424 セブンイレブン 西院駅南 532 4.454104424 セブンイレブン 小田原飯田岡駅南 533 4.454104424 セブンイレブン 市川行徳駅南 534 4.454104424 セブンイレブン 天神橋筋6丁目駅南 535 4.454104424 セブンイレブン 横浜大口駅南 536 4.454104424 セブンイレブン 都立大学駅南 537 4.454104424 セブンイレブン 神戸本山駅南 538 4.454104424 セブンイレブン 世田谷桜上水駅南 539 4.454104424 セブンイレブン 東中野駅南 540 4.454104424 セブンイレブン 東福生駅南 541 4.454104424 セブンイレブン 大宮駅南銀座通り 542 4.454104424 セブンイレブン 京都二条駅南 543 4.454104424 セブンイレブン 松阪駅南 544 4.454104424 セブンイレブン 京阪橋本駅南 545 4.454104424 セブンイレブン 近鉄河内小阪駅南 546 4.454104424 セブンイレブン 高浜吉浜駅南 547 4.454104424 セブンイレブン 喜連瓜破駅南 548 4.454104424 セブンイレブン 泉大津駅南 549 4.454104424 セブンイレブン 近鉄布施駅南 550 4.454104424 セブンイレブン 小山駅南5丁目 551 4.454104424 セブンイレブン 横浜星川駅南 552 4.454104424 セブンイレブン 港区虎ノ門駅南 553 4.454104424 セブンイレブン キヨスクJR兵庫駅南 554 4.454104424 セブンイレブン 小山駅南町1丁目 555 4.454104424 セブンイレブン 阪神大物駅南 556 4.454104424 ローソン ローソン 青葉市ケ尾駅南 557 4.454104424 ローソン ローソン 小山駅南町四丁目 558 4.454104424 ローソン ローソン 志村坂上駅南 559 4.454104424 ローソン ローソン 出雲駅南 560 4.454104424 ローソン ローソン 阪急豊中駅南 561 4.454104424 ローソン ローソン S OSLなんば駅南 562 4.454104424 ローソン ローソン 喜多見駅南 563 4.454104424 ローソン ローソン S OSL北浜駅南 564 4.454104424 ローソン ローソン LTF市川駅南 565 4.454104424 ローソン ローソン 幕張駅南 566 4.454104424 ローソン ローソン S OSL谷町四丁目駅南 567 4.454104424 ローソン ローソン S OSL住之江公園駅南 568 4.454104424 ローソン ローソン LTF元加治駅南 569 4.454104424 ローソン ローソン 久我山駅南 570 4.454104424 ローソン ローソン S OSL天王寺駅南 571 4.454104424 ローソン ローソン 大崎古川駅南 572 4.454104424 ローソン ローソン 新潟駅南 573 4.454104424 ローソン ローソン 高宮駅南 574 4.454104424 ローソン ローソン 虎ノ門駅南 575 4.454104424 ローソン ローソン 博多駅南六丁目 576 4.454104424 ローソン ローソン 下松駅南 577 4.454104424 ローソン ローソン 肥後大津駅南 578 4.454104424 ローソン ローソン 三宮駅南 579 4.454104424 ローソン ローソン 高岳駅南 580 4.454104424 ローソン ローソン 児島駅南 581 4.454104424 ローソン ローソン 上前津駅南 582 4.454104424 ローソン ローソン 伏見稲荷駅南 583 4.454104424 ローソン ローソン 伊勢原駅南 584 4.454104424 ローソン ローソン 本庄駅南二丁目 585 4.454104424 ローソン ローソン JR新長田駅南 586 4.454104424 ローソン ローソン 新高島平駅南 587 4.454104424 ローソン ローソン 八潮駅南 588 4.454104424 ローソン ローソン 阪急茨木市駅南 589 4.454104424 ローソン ローソン 阪神御影駅南 590 4.454104424 ローソン ローソン 博多駅南一丁目 591 4.454104424 ローソン ローソン 名駅南二丁目 592 4.454104424 ローソン ローソン 明大前駅南 593 4.454104424 ローソン ローソン 森ノ宮駅南 594 4.454104424 ローソン ローソン 鳥取駅南 595 4.454104424 ローソン ローソン 鶯谷駅南 596 4.454104424 ローソン ローソン 近江八幡駅南 597 4.454104424 ローソン ローソン 尼崎立花駅南 598 4.454104424 ファミリーマート 小倉駅南店 599 4.454104424 ファミリーマート 福岡姪浜駅南店 600 4.454104424 ファミリーマート 博多駅南三丁目店 601 4.454104424 ファミリーマート 小倉下曽根駅南店 602 4.454104424 ファミリーマート 幡ヶ谷駅南店 603 4.454104424 ファミリーマート 新宿駅南店 604 4.454104424 ファミリーマート 八千代緑ヶ丘駅南店 605 4.454104424 ファミリーマート 九条駅南店 606 4.454104424 ファミリーマート 永福町駅南店 607 4.454104424 ファミリーマート 野方駅南店 608 4.454104424 ファミリーマート 中野駅南店 609 4.454104424 ファミリーマート 五反田駅南店 610 4.454104424 ファミリーマート 学芸大学駅南店 611 4.454104424 ファミリーマート 高尾駅南店 612 4.454104424 ファミリーマート 梶が谷駅南店 613 4.454104424 ファミリーマート 下北沢駅南店 614 4.454104424 ファミリーマート 糀谷駅南店 615 4.454104424 ファミリーマート 西荻窪駅南店 616 4.454104424 ファミリーマート 新井薬師前駅南店 617 4.454104424 ファミリーマート 芦花公園駅南店 618 4.454104424 ファミリーマート 新座駅南店 619 4.454104424 ファミリーマート 藤枝駅南通り店 620 4.454104424 ファミリーマート 春田駅南店 621 4.454104424 ファミリーマート 上新庄駅南店 622 4.454104424 ファミリーマート 福島駅南店 623 4.454104424 ファミリーマート 久留米金島駅南店 624 4.454104424 ファミリーマート 狛江駅南店 625 4.454104424 ファミリーマート 大山駅南店 626 4.454104424 ファミリーマート 御茶ノ水駅南店 627 4.454104424 ファミリーマート 亀戸駅南店 628 4.454104424 ファミリーマート 須坂駅南店 629 4.454104424 ファミリーマート 大和駅南店 630 4.454104424 ファミリーマート 坂戸駅南けやき通り店 631 4.454104424 ファミリーマート 和田町駅南店 632 4.454104424 ファミリーマート 三郷駅南店 633 4.454104424 ファミリーマート 下丸子駅南店 634 4.454104424 ファミリーマート 青葉台駅南店 635 4.454104424 ファミリーマート みのり台駅南店 636 4.454104424 ファミリーマート 袋井愛野駅南店 637 4.454104424 ファミリーマート 大正駅南店 638 4.454104424 ファミリーマート JR西宮駅南店 639 4.454104424 ファミリーマート 明石駅南店 640 4.454104424 ファミリーマート 姫路駅南店 641 4.454104424 ファミリーマート 加美駅南店 642 4.454104424 ファミリーマート 吉田駅南店 643 4.454104424 ファミリーマート 池田駅南店 644 4.454104424 ファミリーマート 地下鉄あびこ駅南店 645 4.454104424 ファミリーマート JR総持寺駅南店 646 4.454104424 ファミリーマート 横川駅南店 647 4.454104424 ファミリーマート 大森駅南店 648 4.454104424 ファミリーマート 西岐阜駅南店 649 4.454104424 ファミリーマート 久我山駅南店 650 4.454104424 ファミリーマート 名駅南四丁目店 651 4.454104424 ファミリーマート 三河高浜駅南店 652 4.454104424 ファミリーマート 八潮駅南店
- 投稿日:2021-05-16T21:38:03+09:00
【MySQL】Docker 日本語化 SQL 学習メモ
MySQL環境構築 MySQLの起動 # mysqlのイメージ取得 $ docker pull mysql # コンテナ作成・起動 $ docker run -it --name ${任意のコンテナ名} -e MYSQL_ROOT_PASSWORD=${任意のmysqlパスワード} -d mysql:latest # mysqlコンテナのshellに入る $ docker exec -it ${上記で設定したコンテナ名} bash # mysqlにログインパスワードは、上記で設定したもの $ mysql -u root -p MySQLの日本語対応(コマンドラインで日本語が入力できないため) $ locale -a | grep ja # 設定されていないため以下の表記 locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_COLLATE to default locale: No such file or directory # 必要なものインストール $ apt-get install locales dialog # 設定 $ dpkg-reconfigure locales $ localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 $ export LC_ALL=ja_JP.UTF-8 $ locale -a | grep ja # 以下の設定になっていればOK ja_JP ja_JP.utf8 Sampleデータベース、テーブル作成 -- データベース作成 CREATE DATABASE shop; -- 商品テーブル作成 CREATE TABLE shohin ( shohin_id CHAR(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 ); -- データ挿入 BEGIN; insert into shohin values ('0001', 'Tシャツ', '衣服', 1000, 500, '2009-09-20'); insert into shohin values ('0002', '穴あけパンチ', '事務用品', 500, 320, '2009-09-11'); insert into shohin values ('0003', 'カッターシャツ', '衣服', 4000, 2800, NULL); insert into shohin values ('0004', '包丁', 'キッチン用品', 3000, 2800, '2009-09-20'); insert into shohin values ('0005', '圧力鍋', 'キッチン用品', 6800, 5000, '2009-01-15'); insert into shohin values ('0006', 'フォーク', 'キッチン用品', 500, NULL, '2009-09-20'); insert into shohin values ('0007', 'おろしがね', 'キッチン用品', 880, 790, '2009-04-28'); insert into shohin values ('0008', 'ボールペン', '事務用品', 100, NULL, '2009-11-11'); COMMIT; -- 商品2テーブル作成 CREATE TABLE shohin2 ( shohin_id CHAR(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 ); -- データ挿入 BEGIN; insert into shohin2 values ('0001', 'Tシャツ', '衣服', 1000, 500, '2009-09-20'); insert into shohin2 values ('0002', '穴あけパンチ', '事務用品', 500, 320, '2009-09-11'); insert into shohin2 values ('0003', 'カッターシャツ', '衣服', 4000, 2800, NULL); insert into shohin2 values ('0009', '手袋', '衣服', 800, 500, NULL); insert into shohin2 values ('0010', 'やかん', 'キッチン用品', 2000, 1700, '2009-09-20'); COMMIT; -- 店舗テーブル作成 CREATE TABLE tenposhohin( tenpo_id CHAR(4) NOT NULL, tenpo_mei VARCHAR(200) NOT NULL, shohin_id CHAR(4) NOT NULL, suryo int NOT NULL, PRIMARY KEY(tenpo_id, shohin_id) ); -- データ挿入 BEGIN; INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000A', '東京', '0001', 30); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000A', '東京', '0002', 50); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000A', '東京', '0003', 15); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000B', '名古屋', '0002', 30); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000B', '名古屋', '0003', 120); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000B', '名古屋', '0004', 20); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000B', '名古屋', '0006', 10); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000B', '名古屋', '0007', 40); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000C', '大阪', '0003', 20); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000C', '大阪', '0004', 50); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000C', '大阪', '0006', 90); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000C', '大阪', '0007', 70); INSERT INTO tenposhohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES('000D', '名古屋', '0001', 100); COMMIT; 商品テーブル shohin_id shohin_mei shohin_bunrui hanbai_tanka shiire_tanka torokubi 0001 Tシャツ 衣服 1000 500 2009-09-20 0002 穴あけパンチ 事務用品 500 320 2009-09-11 0003 カッターシャツ 衣服 4000 2800 NULL 0004 包丁 キッチン用品 3000 2800 2009-09-20 0005 圧力鍋 キッチン用品 6800 5000 2009-01-15 0006 フォーク キッチン用品 500 NULL 2009-09-20 0007 おろしがね キッチン用品 880 790 2009-04-28 0008 ボールペン 事務用品 100 NULL 2009-11-11 商品テーブル2 shohin_id shohin_mei shohin_bunrui hanbai_tanka shiire_tanka torokubi 0001 Tシャツ 衣服 1000 500 2009-09-20 0002 穴あけパンチ 事務用品 500 320 2009-09-11 0003 カッターシャツ 衣服 4000 2800 NULL 0009 手袋 衣服 800 500 NULL 0010 夜間 キッチン用品 2000 1700 2009-09-20 SELECT文 実行順序 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 集約関数 *NULLは除外される。 Count関数 -- 全選択 -> 6 SELECT COUNT(*) FROM shohin; -- カラム指定 -> 8 SELECT COUNT(shiire_tanka) FROM shohin; -- 重複別 -> 3 SELECT COUNT(DISTINCT shohin_bunrui) FROM shohin; Min/Max関数 Avg関数 Sum関数 GROUP BY *SELECT句は、GROUP BYの後に実行されるため、AS句は使えない。 商品分類ごとにグループ化 SELECT shohin_bunrui COUNT(*) FROM shohin GROUP BY shohin_bunrui; Having *WHERE句でも同じ絞り込みができる場合は、WHERE句に記述する。 →COUNT関数が走るときにソートが行われるため(処理が重くなる)。 商品分類ごとでカウントが2つのもの SELECT shohin_bunrui COUNT(*) FROM shohin GROUP BY shohin_bunrui HAVING COUNT(*) = 2; 商品分類ごとで販売単価平均が2500以上 SELECT shohin_bunrui, AVG(hanbai_tanka) FROM shohin GROUP BY shohin_bunrui HAVING AVG(hanbai_tanka) >= 2500; ORDER BY句 AS句が使える SELECT文の一番最後に書く 集約関数も利用可能 SELECT shohin_bunrui, COUNT(*) FROM shohin GROUP BY shohin_bunrui ORDER BY COUNT(*); INSERT insert into .... selectで他テーブルへコピー。集計関数も使用可能 DELETE 全権削除の場合、TRUNCATEの方が高速。 ビュー SELECT文を保存可能 サブクエリ FROM句にSELECT文書ける スカラサブクエリ 戻り値が単一なので条件にかける SELECT * FROM shohin WHERE habai_tanka > (SELECT AVG(hanbai_tanka) FROM Shohin); 相関サブクエリ 戻り値が複数ある時の比較(小分けしたグループ内での比較) 述語 LIKE 前方WHERE shohin_mei LIKE 'カ%'; 中間WHERE shohin_mei LIKE '%カ%'; 後方WHERE shohin_mei LIKE '%カ'; 任意の文字数WHERE shohin_mei LIKE '_カ_'; BETWEEN 範囲検索WHERE hanbai_tanka BETWENN 100 AND 1000; *両端の値も含む(100<=x<=1000)。 IS NULL, IS NOT NULL WHERE hanbai_tanka IS NULL; WHERE hanbai_tanka IS NOT NULL; IN, NOT IN サブクエリが使える。 WHERE hanbai_tanka IN (320, 500, 5000); WHERE hanbai_tanka NOT IN (320, 500, 5000); EXISTS 必ず相関サブクエリを引数に取る CASE式 テーブル同士の操作 集合演算 テーブルの演算(行の操作) UNION 和集合(UNION ALLで重複行表示) ORDER BYは共通で1つ SELECT shohin_id, shohin_mei FROM shohin UNION ALL SELECT shohin_id, shohin_mei FROM shohin2 INTERSECT 未対応 EXCEPT 未対応 結合(列の操作) 内部結合 両方のテーブルに情報が存在するもの SELECT TS.tenpo_id, TS.tenpo_mei, TS.shohin_id, S.shohin_mei, S.hanbai_tanka FROM tenposhohin AS TS INNER JOIN shohin as S ON TS.shohin_id = S.shohin_id; 外部結合 どちらかのテーブルに情報が存在するもの LEFT, RIGHTどちらをマスタにするか SELECT TS.tenpo_id, TS.tenpo_mei, TS.shohin_id, S.shohin_mei, S.hanbai_tanka FROM tenposhohin AS TS RIGHT OUTER JOIN shohin as S ON TS.shohin_id = S.shohin_id; -- 3テーブル FROM tenposhohin AS TS INNER JOIN shohin as S ON TS.shohin_id = S.shohin_id INNER JOIN zaikoshohin as ZS ON TS.shohin_id = ZS.shohin_id;
- 投稿日:2021-05-16T14:18:59+09:00
Spring + MySQL を用いたREST APIのDocker化メモ
SpringとMySQLを利用したREST APIをDockerで動作させた際のメモ Springで作成したAPIをDockerで動作するTomcatにデプロイし、同じくDockerで動作するMySQLに接続させる。 プロジェクト構成 ルート │ docker-compose.yml │ ├─ap │ └─docker │ │ Dockerfile │ │ │ └─webapps │ rest.war │ └─db └─docker └─db │ my.cnf docker-compose.yml version: "3" services: ap: build: ./ap/docker image: rest_api_image container_name: tomcat_container ports: - 8080:8080 links: - db db: image: mysql:5.7 container_name: mysql_container environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: sample_db MYSQL_USER: mysqluser MYSQL_PASSWORD: mysqlpass volumes: - ./db/docker/db/data:/var/lib/mysql - ./db/docker/db/my.cnf:/etc/mysql/conf.d/my.cnf restart: always ports: - 3306:3306 ap Dockerfile FROM tomcat:8.5.35 EXPOSE 8080 RUN useradd -s /sbin/nologin tomcat RUN chown -R tomcat:tomcat /usr/local/tomcat USER tomcat COPY webapps/rest.war /usr/local/tomcat/webapps/ CMD ["catalina.sh", "run"] rest.war こちらで作成したAPIを以下のように改修し.warファイルにビルドする。 改修箇所 エントリポイント(UserApplication) SpringBootServletInitializerクラスを継承させ、configureメソッドをoverrideさせる。 package com.example.restservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication @EnableJpaAuditing public class UserApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(UserApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(UserApplication.class); } } pom.xml 以下を追加。 <packaging>war</packaging> ... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> DB接続設定(application.properties) localhostではなく、DBコンテナ名を指定する。 spring.datasource.url=jdbc:mysql://mysql_container:3306/sample_db spring.datasource.username=mysqluser spring.datasource.password=mysqlpass spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver db my.cnf 文字コード指定 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4 動作確認 1.コンテナを起動する。 docker-compose up 2.DBにテーブルを作成する。 こちらのSQLを実行し、テーブルを作成する。 3.APIを呼び出す。 ※呼び出しの際には、http://localhost:8080/{warファイル名}/api/users となる点に注意する。 ユーザー登録API(POST /rest/api/users) リクエスト POST /rest/api/users HTTP/1.1 Host: localhost:8080 Content-Type: application/json Content-Length: 24 { "name":"test4" } レスポンス { "id": 4, "name": "test4" } ユーザー取得API(GET /rest/api/users/{user_id}) リクエスト GET /rest/api/users/4 HTTP/1.1 Host: localhost:8080 Content-Type: application/json レスポンス { "id": 4, "name": "test4" } ユーザー一覧取得API (GET /rest/api/users) リクエスト GET /rest/api/users HTTP/1.1 Host: localhost:8080 Content-Type: application/json レスポンス [ { "id": 1, "name": "test" }, { "id": 2, "name": "test2" }, { "id": 3, "name": "test3" }, { "id": 4, "name": "test4" } ] 詰まったところ 404 Not Found 以下の対応を行った。 Dockerfileにtomcatユーザーを作成し、権限設定する処理を記述(参考)。 エントリーポイントクラスにSpringBootServletInitializerクラスを継承させ、configureメソッドをoverride(参考)。 参考情報 Spring BootでWARを作成して別のTomcatにデプロイする
- 投稿日:2021-05-16T12:36:41+09:00
Host 'IPアドレス' is not allowed to connect to this MySQL serverの対処
DockerfileにImageMagicをインストールする記述を入れてコンテナイメージをビルドしました。 そこでDocker-composeを再起動してリロードをしてみた所、以下のエラーが出てきてしまいました。 Host 'IPアドレス' is not allowed to connect to this MySQL server そこで色々と考えてみたのですが、原因はおそらくいままでDocker、Docker−composeを使ってきた時に出てきたキャッシュが影響してしまっているのではないかと考えました。 幸いdocker-compose は起動することができていたので、以下のコマンドをやってみました。 docker-compose down --rmi all --volumes --remove-orphans というコマンドをやってみて、コンテナイメージとコンテナとネットワークなどをすべて削除しました。 そして、もう一度 docker-compose build をしてみました。 そうしたら無事起動しました。 キャッシュが影響することってよくあるんですね。 知らなかったです。 指摘や間違っているところがありましたらご指摘お願いします。 出典
- 投稿日:2021-05-16T11:59:12+09:00
[Java]Spring + MySQL を用いたREST API作成メモ
SpringとMySQLを利用したREST API作成メモ API例 以下のようなユーザー情報の登録、取得、一覧取得用APIを作成する。 ユーザー登録API(POST /api/users) リクエスト POST /api/users HTTP/1.1 Host: localhost:8080 Content-Type: application/json Content-Length: 24 { "name":"test4" } レスポンス { "id": 4, "name": "test4" } ユーザー取得API(GET /api/users/{user_id}) リクエスト GET /api/users/4 HTTP/1.1 Host: localhost:8080 Content-Type: application/json レスポンス { "id": 4, "name": "test4" } ユーザー一覧取得API (GET /api/users) リクエスト GET /api/users HTTP/1.1 Host: localhost:8080 Content-Type: application/json レスポンス [ { "id": 1, "name": "test" }, { "id": 2, "name": "test2" }, { "id": 3, "name": "test3" }, { "id": 4, "name": "test4" } ] 接続用MySQL DB構築 こちらの手順でMySQLコンテナを立ち上げる。 以下のSQLusersテーブルを作成する。 CREATE TABLE `sample_db`.`users` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) NULL, PRIMARY KEY (`id`), UNIQUE INDEX `id_UNIQUE` (`id` ASC)); API 実装 Application層 Controller (UserController) リクエストを受け付け、ドメイン層UserRepositoryを呼び出す。 package com.example.restservice.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.example.restservice.exception.NotFoundException; import com.example.restservice.model.User; import com.example.restservice.repository.UserRepository; // Controller @RestController @RequestMapping("/api") public class UserController { @Autowired UserRepository UserRepository; @GetMapping("/users") public List<User> getAllUsers() { return UserRepository.findAll(); } @PostMapping("/users") public User createUser(@Validated @RequestBody User User) { return UserRepository.save(User); } @GetMapping("/users/{id}") public User getUserById(@PathVariable(value = "id") Integer UserId) { return UserRepository.findById(UserId) .orElseThrow(() -> new NotFoundException("User", "id", UserId)); } } Domain層 Respository Interface(UserRepository) データ操作を担う。 package com.example.restservice.repository; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.example.restservice.model.User; // Repository Interface @Repository public interface UserRepository extends JpaRepository<User, Integer> { } Infrastructure層 Entity(User) package com.example.restservice.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Data; @Entity @Data @Table(name = "users") public class User { @Id @Column(name = "id") @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; @Column(name = "name") private String name; } 例外(NotFoundException) 取得API実行時にスローする例外 package com.example.restservice.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(value = HttpStatus.NOT_FOUND) public class NotFoundException extends RuntimeException { private String resourceName; private String fieldName; private Object fieldValue; public NotFoundException( String resourceName, String fieldName, Object fieldValue) { super(String.format("%s not found with %s : '%s'", resourceName, fieldName, fieldValue)); this.resourceName = resourceName; this.fieldName = fieldName; this.fieldValue = fieldValue; } public String getResourceName() { return resourceName; } public String getFieldName() { return fieldName; } public Object getFieldValue() { return fieldValue; } } DB接続設定 src/main/resources/application.propertiesに以下を記述する。 spring.datasource.url=jdbc:mysql://localhost:3306/sample_db spring.datasource.username=mysqluser spring.datasource.password=mysqlpass spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 動作確認 上記のAPI例のリクエストを投げ、レスポンスを受信できることを確認する。 参考情報 Spring Bootで実装するWebAPIのアーキテクチャを考える callicoder/spring-boot-mysql-rest-api-tutorial
- 投稿日:2021-05-16T11:43:18+09:00
VirtualBox内のCentOS7にMySQLをインストールする
参考にした記事 インストール手順 https://qiita.com/ritukiii/items/f4e2fbae5d6e7b1aa5f9 https://qiita.com/nooboolean/items/7efc5c35b2e95637d8c1 名前解決 https://qiita.com/taro0219/items/5bde092868b5ac817977 IPv6の無効化 https://www.server-memo.net/centos-settings/centos7/disable-ipv6.html 環境 Windows10上でCentOS7を稼働 インストールしたいMySQL バージョン8.0 目的 学習用に作成したJavaのSpringBootのプロジェクトをLinux環境にデプロイして起動したい 苦労した点 CUIが慣れていない 当方、Linux操作も慣れておらず、基本的な操作が見についていない。 よって、出回っている情報だと当方には不足している感が強い。 ていうか、初心者のくせにGUIじゃなくてCUIベースを使おうとしていたことにより、windowsで慣れた直感的な操作ができないので戸惑うことが多かった。 でも勉強になりますけどね! ダウンロードができない VirtualBox内のCentOS7からインターネットに接続するときのイメージ これはホントにイメージね!(正しいかはわかりません) そもそもWindowsで普通に作業をしていたら気にすることもないし~ おそらくになるけど、なにかダウンロードする時は普通は以下のようなイメージ。 でもCentOS7では以下間にWindowsが入ってくるから、なにか設定が必要になるのかなと考えています。 (間違っていたらご指摘いただけると幸いです^^) MySQLのインストール手順 公式サイトより https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html Adding the MySQL Yum Repository First, add the MySQL Yum repository to your system's repository list. This is a one-time operation, which can be performed by installing an RPM provided by MySQL. Follow these steps: Go to the Download MySQL Yum Repository page (https://dev.mysql.com/downloads/repo/yum/) in the MySQL Developer Zone. Select and download the release package for your platform. Install the downloaded release package with the following command, replacing platform-and-version-specific-package-name with the name of the downloaded RPM package: MySQL Yumリポジトリをリポジトリリストに追加しなあかん 何かをダウンロードしなあかん ダウンロードしたやつをインストールしなあかん ということですね。 問題はここ。ダウンロード! どこにダウンロードされるかが問題だ 普通にwindowsでhttps://dev.mysql.com/downloads/repo/yum/ にアクセスしてダウンロードしても、windowsにダウンロードされる。 だからCentOS7に入ってない だからCentOS7にインストールできない LinuxにCUIからどうやってダウンロードする? まず思いついたのが、FTPでwindowsにダウンロードしたものを転送する。 でもそれLinuxの操作じゃないからあかんやん。 てかyumとかのコマンドで普通はダウンロードとかインストールとかするはずだからlinuxからインターネット接続できるはずだからダウンロードもできるはずやから、なんとかlinuxからコマンドでダウンロードしたい! そこで問題になったのが 1. ダウンロードコマンド 1. 名前解決 1. ダウンロード先のディレクトリ ダウンロードコマンド wget [ダウンロードリンク先URL] か curl [ダウンロードリンク先URL] が使えるっぽい。 自分はwget使いました だいたいダウンロードボタンのところで「リンク先をコピー」とやればURLは大丈夫のハズ 名前解決 ダウンロードのコマンドを実行したら 名前解決ができていないというエラー could not resolve host dev.mysql.com これのせいでダウンロードできない。 そこでいろいろ見て試したことは * CentOS7のIPv6の無効化 * DNSサーバの設定 // IPv6無効化 $ echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 $ echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6 // DNS設定 $ nmcli c modify eth0 ipv4.dns 8.8.8.8 // ネットワーク再起動 $ systemctl restart network // 設定確認 $ nmcli d show eth0 // インターネットに接続できてるかの確認 $ ping www.google.com キャッシュが残っているなら削除しないと行けない すでにMySQLが入っている場合や、失敗した作業があったりでなにかyumのキャッシュというのでしょうか、そういうのが残っているとエラーが発生するようです。 なので次を実行して競合しないようにする。 // インストール済みのMYSQLの確認 $ yum list installed | grep mysql // 削除 $ yum remove mysql* 再度ダウンロードのコマンドを実行するとうまくいきましたけど、、、 ダウンロードディレクトリはどこぞ??? ちょっとわかりませんでした。。。(誰か教えて~!) のでtmpディレクトリに移動してそこでコマンド実行して、tmpにダウンロードするようにしました。 $ ls /tmp mysql80-community-release-el7-3.noarch.rpm // これがダウンロードできた!! もうすでに達成感!(いや、まだやろい!) tmpディレクトリ内でインストールコマンドを実行 $ yum install -y install mysql-community-server インストールできたか確認 $ mysql --version mysql Ver 8.0.25 for Linux on x86_64 (MySQL Community Server - GPL) やっとだぜ・・・ ・・・インストールだけでどんだけかかんねん・・・・ とりあえず、ダウンロードどうやんねんとか名前解決ってなんやねんってなる方の参考に慣ればと思います。 また、記事の内容に間違いなどありましたらお手数ですがご指摘いただければ幸いです。 ご質問がある方もどうぞコメント下さい。 よろしくお願いいたしますm(__)m
- 投稿日:2021-05-16T11:37:24+09:00
データベースを設計する前に!
データベースを設計する前に データベースは多くの場合、アプリケーション本体よりも長く付き合っていくものになります。(開発している段階から使用する+他のアプリケーションでもそのデータベースを使う可能性があるため) 適当な名前をつけたり、一貫性のない名前の付け方をすると、読みづらくなるだけではなくトラブルの温床になります。自分だけしか利用しない場合であっても、以下の点を最低限考慮して設計すると良いでしょう。 予約語 データベースのテーブル名やカラム名などを決める際にまず考えなくてはいけないのは、使用したい言葉が予約語にないものかどうかを確認をすることです。予約語にその単語がある場合、SQLコマンドが正常に動作しない場合があります。 例えば、PHPだと使用するmigrationやseedingをartisanコマンドで実行した場合には、うまくいくけれど、その時発行されるSQL文を直接コンソールから入力すると予約語のエラーになるなどして、トラブルの原因特定が難しくなります。そのため、設計の段階から予約語は使わないように心がけましょう。 実際に使ってしまった予約語 column order こちらでMySQL公式サイトから予約語の確認ができます ページ内検索をかけて確認しましょう テーブル名は複数形 基本的にはテーブルに複数のカラムが入ることになるので、入る名称の複数形をつけることが一般的です。 例えばPHPでLaravelを使用しているとき、Modelクラスで定義したクラス名(単数形)とデータベース側のテーブル名の複数形が紐づくようになっているため、特別な理由がなければそのルールに従いましょう。 例)Model:Userクラス→Database:usersテーブル ※余談ですがLaravelの場合、「複数形」は英語のルールに則ったものになります。 例) box->boxes 単語と単語の間は「_」で区切ろう データベース内では大文字小文字が基本的に区別されません。 そのため、単語と単語の間は「_」で区切るような名前をつけると良いでしょう。この形式を「スネークケース」という。 例) user_id 外部キーを設定するときには、「テーブル名+_+id」で指定しよう テーブル同士に関連性を持たせる場合、外部キーなどを設定することがあります。多くの場合、外部キーの制約はPRIMARY KEYとなるidに対する制約をすることが多いでしょう。カラム名をみただけでどのテーブルの何カラムに対する外部キーなのかがわかるようにしましょう。 例) usersテーブルのidカラムに対する外部キーをuser_infoテーブルに設定する場合 usersテーブル user_infoテーブル id id account name password address users_id
- 投稿日:2021-05-16T11:37:24+09:00
データベースを設計する前に
データベースを設計する前に データベースは多くの場合、アプリケーション本体よりも長く付き合っていくものになります。(開発している段階から使用する+他のアプリケーションでもそのデータベースを使う可能性があるため) 適当な名前をつけたり、一貫性のない名前の付け方をすると、読みづらくなるだけではなくトラブルの温床になります。自分だけしか利用しない場合であっても、以下の点を最低限考慮して設計すると良いでしょう。 予約語 データベースのテーブル名やカラム名などを決める際にまず考えなくてはいけないのは、使用したい言葉が予約語にないものかどうかを確認をすることです。予約語にその単語がある場合、SQLコマンドが正常に動作しない場合があります。 例えば、PHPだと使用するmigrationやseedingをartisanコマンドで実行した場合には、うまくいくけれど、その時発行されるSQL文を直接コンソールから入力すると予約語のエラーになるなどして、トラブルの原因特定が難しくなります。そのため、設計の段階から予約語は使わないように心がけましょう。 実際に使ってしまった予約語 column order こちらでMySQL公式サイトから予約語の確認ができます ページ内検索をかけて確認しましょう テーブル名は複数形 基本的にはテーブルに複数のカラムが入ることになるので、入る名称の複数形をつけることが一般的です。 例えばPHPでLaravelを使用しているとき、Modelクラスで定義したクラス名(単数形)とデータベース側のテーブル名の複数形が紐づくようになっているため、特別な理由がなければそのルールに従いましょう。 例)Model:Userクラス→Database:usersテーブル ※余談ですがLaravelの場合、「複数形」は英語のルールに則ったものになります。 例) box->boxes 単語と単語の間は「_」で区切ろう データベース内では大文字小文字が基本的に区別されません。 そのため、単語と単語の間は「_」で区切るような名前をつけると良いでしょう。この形式を「スネークケース」という。 例) user_id 外部キーを設定するときには、「テーブル名+_+id」で指定しよう テーブル同士に関連性を持たせる場合、外部キーなどを設定することがあります。多くの場合、外部キーの制約はPRIMARY KEYとなるidに対する制約をすることが多いでしょう。カラム名をみただけでどのテーブルの何カラムに対する外部キーなのかがわかるようにしましょう。 例) usersテーブルのidカラムに対する外部キーをuser_infoテーブルに設定する場合 usersテーブル user_infoテーブル id id account name password address users_id
- 投稿日:2021-05-16T11:15:44+09:00
MySQLでクエリーの実行時間を計測する
コマンド SQL_FILE=<sql_file> DB_USER=<db_user> DB_NAME=<db_name> DB_PORT=<db_port> $ cat $SQL_FILE | mysql -u $DB_USER -p $DB_NAME --port=$DB_PORT --protocol=TCP -vvv | tail -n 3 | head -1 出力結果例 332 rows in set (0.03 sec)
- 投稿日:2021-05-16T02:25:33+09:00
【コピペ】AWS Cloud9でLaravel環境を構築その弐
前回、Cloud9でLaravel環境を構築した。 【コピペ】AWS Cloud9でLaravel環境を構築その壱 だけど、MySQLに外部接続できなかったので、設定する。 マシンスペック Mac mini 2018 macOS Catalina(10.15.x) Intel Core-i7 3.2GHz 6コア メモリ 32GB SSD 512GB Laravel環境 Nginx 最新版 PHP(PHP-FPM) 7.2.x MySQL 5.7 Composer 最新版 Laravel 5.6 やること Cloud9のEC2インスタンスのMySQLに外部接続する 前提 【コピペ】AWS Cloud9でLaravel環境を構築その壱は構築済み。 EC2インスタンスのMySQLに外部接続する Cloud9環境を作成すると、セットでEC2インスタンスも作成される。 EC2の設定 EC2を開く。 インスタンスIDを選択する。 セキュリティグループを開く。 インバウンドルールを編集する。 ルールを追加して保存する。 ※参考 ec2のmySqlに外部サーバから接続する方法 AWS EC2のデータベースに外部からODBC経由で接続するための設定 rootで外部接続を許可 $ mysql -u root -p Enter password: cloud9#CLOUD9 mysql> select user, host from mysql.user; +---------------+-----------+ | user | host | +---------------+-----------+ | fuga | % | | fuga | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-----------+ 5 rows in set (0.00 sec) 当然ながらrootは中からしかアクセスできないが、外部から接続可能にする。 mysql> GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'cloud9#CLOUD9'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> select user, host from mysql.user; +---------------+-----------+ | user | host | +---------------+-----------+ | fuga | % | | root | % | | fuga | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-----------+ 6 rows in set (0.00 sec) mysql> quit ※参考 外部のホストから接続できるようにする方法 DBクライアントから接続する パブリック IPv4 DNSをコピーする。 下記の接続情報で、お好きなDBクライアントで接続する。 ホスト ユーザー パスワード パブリック IPv4 DNS root cloud9#CLOUD9 ※参考 Sequel AceでMySQLに接続する(Sequel Proの後継) DBクライアントツールはDBeaverをおすすめしたい