- 投稿日:2020-02-14T21:30:50+09:00
Ubuntu 18 で MySQL を使うのにやったこと
Ubuntu 18.04.3 (LTS) x64
にmysql
をインストールしてユーザーを設定するまでの手順。MySQL のインストール
# パッケージ目録の更新 $ apt-get update # インストール $ sudo apt install mysql-server # インストールされていることを確認 $ mysql --version $ sudo service mysql statusMySQLのセキュリティ設定
$ sudo mysql_secure_installation # パスワードがセットされたことを確認 $ sudo mysqladmin -p -u root version匿名のユーザー、テストデータベースの削除。リモートでのrootログインを禁止するなどの設定をします。すべての回答にYにしました。
- 投稿日:2020-02-14T18:33:40+09:00
MySQLでAUTO_INCREMENTをリセットする
テーブルのレコードを全削除する前提になります。
TRUNCATE文を使う
TRUNCATE
= テーブルのレコード全件削除mysql> TRUNCATE TABLE ${table_name};でリセットできます。
ALTER文を使う
ALTER TABLE
= テーブル定義を変更
TRUNCATE
文でリセットできない場合(または抵抗がある時)はALTER文
でリセットできます。mysql> ALTER TABLE ${table_name} AUTO_INCREMENT=1でリセットできます。
どんなときに使うか?
リリース前にテストデータを全て削除する時に使います。
TRUNCATE
文でできたらそれで良いのですが、
DELETE
文で全レコード削除してもAUTO_INCREMENT
はリセットできないのです・・・。
例えばユーザーIDにAUTO_INCREMENT
を設定しているなら、
ユーザーIDが30まで1件ずつあるレコードを全て削除してから新たにレコードを挿入すると31から始まってしまいます。
それを防ぐためにAUTO_INCREMENT
にリセットをかけます。参考
【MySQL】auto_increment(オートインクリメント)の連番状態をリセット(初期化)する
全てのデータを削除する(TRANCATE TABLE文)
- 投稿日:2020-02-14T13:50:13+09:00
テンポラリテーブルのサイズ(MySQL)確認
よく調べてて覚えないので備忘録
テンポラリーテーブル(MySQL)のサイズの求め方
SHOW VARIABLES LIKE 'tmp_table_size';気をつけないとfullになって溢れるので
- 投稿日:2020-02-14T13:36:19+09:00
League of Legendsのデータを使ったWEBアプリを作りたい①
Djangoを使ってLOLのデータ収集WEBアプリを作成したい
前回までで一応データの取り出し方とデータベースに保存する方法を学習することができたので、今回のパートからwebアプリの開発をしていきたいと思います。
前回まで、
League of Legendsのデータ取得してみたい①
League of Legendsのデータ取得してみたい②
League of Legendsのデータ取得してみたい③環境
2020/2/8現在
OS:windows10
Anaconda:4.8.1
python:3.7.6
MySQL:8.0.19
Django:3.0.1
PyMySQL:0.9.3Djangoの導入
インストール
python -m pip install django
を実行前回との変更
importするライブラリをMySQLdbからPyMySQLに変更
python -m pip install pymysql
import mysql -> import pymysql作成
初めに、APPというディレクトリ上で
django-admin startproject MyProject
を実行します。
このような階層が出来上がります。
manage.pyと同じ階層でpython manage.py startapp LOLApp
を実行。
このようなものが出来上がります。setting.py変更
INSTALLED_APPSに'LOLApp.apps.LolappConfig',を追加。
次に、DATABASESを変更します。defaultでデータベースがsqlite3になっているのでそれをmysqlにします。元のコードDATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }変更後DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'LOLdb', 'USER': 'root', 'PASSWORD': '{最初に設定したパスワード}', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS':{ 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", } } }次に、LANGUAGE_CODEを'en-us'から'ja'に変更。
最後に、TIME_ZONEを'UTC'から'Asia/Tokyo'に変更。manage.pyを変更
一番最後に
import pymysql pymysql.install_as_MySQLdbを追加。
python manage.py makemigrations LOLApp
を実行
python manage.py migrate
を実行
前回作ったmatch_dataというテーブルのほかに新しいものが作成されます。開発用サーバーを起動
python manage.py runserver
を実行して出力されたアドレスに飛んでみます。
このような画面が出たらとりあえずは成功です。ビューの作成
views.pyfrom django.shortcuts import render from django.http import HttpResponse #追加 # Create your views here. def index(request): return HttpResponse("Hello World!")LOLAppの直下にurls.pyを作成します。
さっきのビューに対応するパスを与えます。LOLApp/urls.pyfrom django.urls import path from . import views urlpatterns = [ path('',views.index,name='index'), ]MyProject直下のurls.pyにも変更を加えます。
MyProject/urls.pyfrom django.contrib import admin from django.urls import path,include #includeを追加 urlpatterns = [ path('admin/', admin.site.urls), path('LOLApp/',include('LOLApp.urls')), #追加 ]
python manage.py runserver
を実行して、さっきのアドレスに/LOLAppを追加してアクセスすると、
となっていればとりあえずOK。モデルを作成
models.pyfrom django.db import models # Create your models here. class Match_data(models.Model): sn = models.CharField(max_length=200) kills = models.IntegerField(default=0) deaths = models.IntegerField(default=0) assists = models.IntegerField(default=0) championId = models.IntegerField(default=0) roles = models.CharField(max_length=200) cs = models.IntegerField(default=0) gold = models.IntegerField(default=0) damage = models.IntegerField(default=0) side = models.CharField(max_length=200) game_time = models.IntegerField(default=0)
python manage.py makemigrations LOLApp
python manage.py migrate
python manage.py sqlmigrate LOLApp 0001
テーブルにlolapp_match_dataが新しく追加される。
python manage.py shell
を実行して実際に試してみる。from LOLApp.models import Match_data Match_data.objects.all() # <QuerySet []> a = Match_data(sn="aaa",kills=2,deaths=3,assists=5,championId=100,roles="MID",cs=100,gold=10000,damage=10000,side="BLUE",game_time=1500) a.save() #データを保存 a #<Match_data: Match_data object (1)>MySQLのコマンドで確かめてみると
データベースに保存されていることが確認できた。管理アカウントの作成
python manage.py createsuperuser
を実行してユーザー名、メールアドレス、パスワードを登録します。
その後、python manage.py runsever
を実行してhttp://127.0.0.1:8000/admin/に移動すると管理サイトに飛ぶことができます。この管理サイトでモデルを操作するために、admin.pyを変更します。admin.pyfrom django.contrib import admin from .models import Match_data # Register your models here. admin.site.register(Match_data)これを追加してから再読み込みをすると
モデルが追加され、
この画面でデータを操作することができます。まとめ
今回は前の項目でデータを取得したものをフレームワークを使って、少し改変してみました。次は、WEBアプリを作るためには表示させるベースを作らないといけないのでそっちを少し作りたいと思います。
- 投稿日:2020-02-14T11:55:13+09:00
【Java】MySQLを絶対に接続させたい!!!~JDBCドライバの取得とJARファイル位置について~
MySQLをプロジェクトで使いたい....
今回のWebアプリケーション制作では、MySQLというデータベースを使ってのアプリ制作です。
Eclipseを使用してJavaでプログラムを書いていたのですが、MySQLってどうやって接続して使うの?という疑問....そこで今回はJavaのプログラムからMySQL(データベース)を利用する手順をまとめました。手順は以下の通りです
1. JDBCドライバの取得(Connector/J)
2. JARファイルをプロジェクトに入れる
3. データ接続を試してみるJDBCドライバとは?
手順1に入る前に...JBDCドライバについて簡単に説明しておきます
JDBCドライバとは、データベースを操作するために必要となるクラスやインターフェース群です。それぞれのデータベース開発元がJARファイル(クラスやインターフェースをまとめて格納したファイル)として提供しています。
今回使用するデータベースはMySQLなのでMySQL専用ののJBDCドライバの取得が必要です。
それが「Connector/J」とです1. JDBCドライバの取得(Connector/J)
手順1です。MySQL専用JBDCドライバConnector/Jを早速取得していきましょう。
下記 URL からダウンロードできます
https://dev.mysql.com/downloads/connector/j/次にSelect Platform: Platform Independent を選択します。
下のZIPと書いてある方をダウンロードします。
ダウンロード出来たら次は展開です。
mysql-connector-java-x.x.xx.zip を右クリック。
「7-Zip -> mysql-connector-java-x.x.xx\ に展開」を選択します。
*7-Zip(圧縮・解凍ソフト)はダウンロードが必要です。*拡張子(zip)が表示されていない方は以下の設定をしてみてください。
Zipファイルが展開されると、mysql-connector-java-x.x.xx フォルダが作成されます。
このフォルダを開きます。
"mysql-connector-java-x.x.xx-bin.jar"があることを確認します。
これで、JBDCドライバの取得ができました
2. JARファイルをプロジェクトに入れる
JBDCドライバの取得ができたので、手順2です。このJARファイルをプロジェクトに入れていきます。
Eclipseを使用していますので、プロジェクトの「ビルドパス」に追加すればJARファイルを実行できます。
動的Webプロジェクトの場合は、WEB-INF/lib以下にJARファイルを配置します。
これで、準備完了です!!!
3. データ接続を試してみる
手順3でしっかりと接続できているか試してみましょう。接続を確認するクラスなどを作成し以下のように接続を確認しましょう。
ConnectSampleimport java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectSample { public static void main(String[] args) { //DB接続用定数 String DATABASE_NAME = "データベース名"; String PROPATIES = "?characterEncoding=UTF-8&serverTimezone=JST"; String URL = "jdbc:mySQL://localhost/" + DATABASE_NAME+PROPATIES; //DB接続用・ユーザ定数 String USER = "ユーザー名"; String PASS = ""; try { //MySQL に接続する Class.forName("com.mysql.cj.jdbc.Driver"); //データベースに接続 Connection conn = DriverManager.getConnection(URL, USER, PASS); // データベースに対する処理 System.out.println("データベースに接続に成功"); } catch (SQLException | ClassNotFoundException e) { e.printStackTrace(); } } }URL:jdbc:mySQL://localhost/+データベース名
ユーザー名はMySQLで新たに設定する事も可能です
CREATE USER '新しいユーザー名'@'localhost'; GRANT SELECT ON データベース名.* TO '新しいユーザー名'@'localhost'; FLUSH privileges;接続を確認できれば完了です。
お疲れ様でした
- 投稿日:2020-02-14T11:52:35+09:00
ActiveRecordのトランザクションのネストに気をつけること
- 確認した環境
- Ruby 2.5.1
- Rails 5.2.1
- MySQL 5.7.27
腕試しに以下のスクリプトを実行した場合、最終行の
User.first.name
は何が得られるか考えてみてください.User.first.update!(name: 'Alice') ActiveRecord::Base.transaction do User.first.update!(name: 'Bob') ActiveRecord::Base.transaction do User.first.update!(name: 'Carol') raise ActiveRecord::Rollback end end User.first.name
正解はここをクリック
User.first.name
の結果は Carol になります.
正解しましたか?
正解する人もいると思いますが直感と違うかと思います.
TL;DR
- 可能ならトランザクションをネストしない設計する
- トランザクションをネストする設計の際は
requires_new: true
を使う
- 付けないと思いのよらないゴミができる可能性がある
検証
分かりやすくするため、SQLをコメントに加えました.
User.first.update!(name: 'Alice') # BEGIN # UPDATE `users` SET `name` = 'Alice' WHERE `users`.`id` = 1 # COMMIT ActiveRecord::Base.transaction do # BEGIN User.first.update!(name: 'Bob') # UPDATE `users` SET `name` = 'Bob' WHERE `users`.`id` = 1 ActiveRecord::Base.transaction do User.first.update!(name: 'Carol') # UPDATE `users` SET `name` = 'Carol' WHERE `users`.`id` = 1 raise ActiveRecord::Rollback end end # COMMIT User.first.name # => 'Carol'requires_new を使った場合
いくつかのRDBにはトランザクションにSAVEPOINTをサポートしているものがあります.
このSAVEPOINTを利用するにはrequires_new
を指定することで有効になり直感に近い挙動をする様になります.User.first.update!(name: 'Alice') # BEGIN # UPDATE `users` SET `name` = 'Alice' WHERE `users`.`id` = 1 # COMMIT ActiveRecord::Base.transaction do # BEGIN User.first.update!(name: 'Bob') # UPDATE `users` SET `name` = 'Bob' WHERE `users`.`id` = 1 ActiveRecord::Base.transaction(requires_new: true) do # SAVEPOINT active_record_1 User.first.update!(name: 'Carol') # UPDATE `users` SET `name` = 'Carol' WHERE `users`.`id` = 1 raise ActiveRecord::Rollback end # ROLLBACK TO SAVEPOINT active_record_1 end # COMMIT User.first.name # => 'Carol'