20200214のMySQLに関する記事は6件です。

Ubuntu 18 で MySQL を使うのにやったこと

Ubuntu 18.04.3 (LTS) x64mysql をインストールしてユーザーを設定するまでの手順。

MySQL のインストール

# パッケージ目録の更新
$ apt-get update
# インストール
$ sudo apt install mysql-server
# インストールされていることを確認
$ mysql --version
$ sudo service mysql status

MySQLのセキュリティ設定

$ sudo mysql_secure_installation
# パスワードがセットされたことを確認
$ sudo mysqladmin -p -u root version

匿名のユーザー、テストデータベースの削除。リモートでのrootログインを禁止するなどの設定をします。すべての回答にYにしました。

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

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文)

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

テンポラリテーブルのサイズ(MySQL)確認

よく調べてて覚えないので備忘録

テンポラリーテーブル(MySQL)のサイズの求め方

SHOW VARIABLES LIKE 'tmp_table_size';

気をつけないとfullになって溢れるので

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

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.3

Djangoの導入

インストール

python -m pip install djangoを実行

前回との変更

importするライブラリをMySQLdbからPyMySQLに変更
python -m pip install pymysql
import mysql -> import pymysql

作成

初めに、APPというディレクトリ上でdjango-admin startproject MyProjectを実行します。
image.png
このような階層が出来上がります。
manage.pyと同じ階層でpython manage.py startapp LOLAppを実行。
image.png
このようなものが出来上がります。

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を実行
image.png
前回作ったmatch_dataというテーブルのほかに新しいものが作成されます。

開発用サーバーを起動

python manage.py runserverを実行して出力されたアドレスに飛んでみます。
image.png
このような画面が出たらとりあえずは成功です。

ビューの作成

views.py
from 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.py
from django.urls import path
from . import views

urlpatterns = [
    path('',views.index,name='index'),
]

MyProject直下のurls.pyにも変更を加えます。

MyProject/urls.py
from 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を追加してアクセスすると、
image.png
となっていればとりあえずOK。

モデルを作成

models.py
from 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
image.png
テーブルに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のコマンドで確かめてみると
image.png
データベースに保存されていることが確認できた。

管理アカウントの作成

python manage.py createsuperuserを実行してユーザー名、メールアドレス、パスワードを登録します。
その後、python manage.py runseverを実行してhttp://127.0.0.1:8000/admin/に移動すると管理サイトに飛ぶことができます。この管理サイトでモデルを操作するために、admin.pyを変更します。

admin.py
from django.contrib import admin
from .models import Match_data

# Register your models here.
admin.site.register(Match_data)

これを追加してから再読み込みをするとimage.png
モデルが追加され、image.png
この画面でデータを操作することができます。

まとめ

今回は前の項目でデータを取得したものをフレームワークを使って、少し改変してみました。次は、WEBアプリを作るためには表示させるベースを作らないといけないのでそっちを少し作りたいと思います。

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

【Java】MySQLを絶対に接続させたい!!!~JDBCドライバの取得とJARファイル位置について~

MySQLをプロジェクトで使いたい....

今回のWebアプリケーション制作では、MySQLというデータベースを使ってのアプリ制作です。
Eclipseを使用してJavaでプログラムを書いていたのですが、MySQLってどうやって接続して使うの?という疑問....

そこで今回はJavaのプログラムからMySQL(データベース)を利用する手順をまとめました。手順は以下の通りです:point_down_tone2:

1. JDBCドライバの取得(Connector/J)
2. JARファイルをプロジェクトに入れる
3. データ接続を試してみる

JDBCドライバとは?

手順1に入る前に...JBDCドライバについて簡単に説明しておきます:wink:
JDBCドライバとは、データベースを操作するために必要となるクラスやインターフェース群です。それぞれのデータベース開発元がJARファイル(クラスやインターフェースをまとめて格納したファイル)として提供しています。
今回使用するデータベースはMySQLなのでMySQL専用ののJBDCドライバの取得が必要です。
それが「Connector/J」とです:bangbang:

1. JDBCドライバの取得(Connector/J)

手順1です。MySQL専用JBDCドライバConnector/Jを早速取得していきましょう。

下記 URL からダウンロードできます:point_down_tone2:
https://dev.mysql.com/downloads/connector/j/

以下のような画面が出てきたでしょうか?
image.png

次にSelect Platform: Platform Independent を選択します。
下のZIPと書いてある方をダウンロードします。
image.png

ダウンロード出来たら次は展開です。
mysql-connector-java-x.x.xx.zip を右クリック。
「7-Zip -> mysql-connector-java-x.x.xx\ に展開」を選択します。
*7-Zip(圧縮・解凍ソフト)はダウンロードが必要です。

コメント 2020-02-14 112439.png

*拡張子(zip)が表示されていない方は以下の設定をしてみてください。

image.png

Zipファイルが展開されると、mysql-connector-java-x.x.xx フォルダが作成されます。
image.png

このフォルダを開きます。
"mysql-connector-java-x.x.xx-bin.jar"があることを確認します。
image.png

これで、JBDCドライバの取得ができました:relaxed:

2. JARファイルをプロジェクトに入れる

JBDCドライバの取得ができたので、手順2です。このJARファイルをプロジェクトに入れていきます。
Eclipseを使用していますので、プロジェクトの「ビルドパス」に追加すればJARファイルを実行できます。
動的Webプロジェクトの場合は、WEB-INF/lib以下にJARファイルを配置します。
image.png

これで、準備完了です!!!

3. データ接続を試してみる

手順3でしっかりと接続できているか試してみましょう。接続を確認するクラスなどを作成し以下のように接続を確認しましょう。

ConnectSample
import 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で新たに設定する事も可能です:point_down_tone2:
CREATE USER '新しいユーザー名'@'localhost'; GRANT SELECT ON データベース名.* TO '新しいユーザー名'@'localhost'; FLUSH privileges;

接続を確認できれば完了です。
お疲れ様でした:grin:

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

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'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む