20191230のMySQLに関する記事は7件です。

MySQLにシェープファイルをインポートするツール(shp2mysql)を作った

はじめに

令和元年冬休みの宿題として、MySQLにシェープファイルをインポートするツール「shp2mysql」を作りました。
正確には、シェープファイルからインポート用のSQLを生成するツールです。インポートはmysqlコマンドを使います。

shp2mysql

シェープファイルはGISで標準的に使われているファイル形式です。

インポートしたデータをMySQL Workbenchで確認するとこんな感じです。

スクリーンショット 2019-12-30 21.53.45.png

このツールを作ろうと思ったきっかけ

現状、MySQLにシェープファイルをインストールするにはGDALをインストールし、付属するogr2ogrを使う必要がありました。

GDALは優れたツールですが、目的が「MySQLにシェープファイルをインポートする」だけであれば、導入ハードルが高めでした。

その点、shp2mysqlは「MySQLにシェープファイルをインポートする」ことに特化している分、導入ハードルが低めです。

また、ogr2ogrと異なりshp2mysqlはMySQLに接続しません。
SQLを生成し、実際の取り込み自体はmysqlコマンドに任せます。

これは下記のメリットがあります。

  • SQLを確認し、必要があれば編集した上で実行できる。
    • 将来的にMySQLのSQLに変更があった場合などにも対応しやすい。
  • MySQLの認証方式の変更に左右されない。
    • GDALではデフォルトの認証方式に対応していないため、MySQLの認証方式を変更する必要がある。

このツールで、MySQLのGIS機能を使う人が増えてくれたら良いなと思っています。

インストール方法

リリースページからファイルをダウンロードします。

https://github.com/hajime-miyauchi/shp2mysql

Windowsの場合

リリースページの「shp2mysql.exe」をダウンロードしてそのまま使えます。

Linuxの場合

リリースページの「shp2mysql-*.tar.gz」をダウンロードして解凍して下記コマンドを実行します。

$ ./configure
$ make
$ sudo make install

場合によってはgettext(iconv)が必要になるかもしれないので、yumなどでインストールしておいてください。

$ yum install gettext-devel

シェープファイルの準備

下記のようなサイトからダウンロードします。

手っ取り早くデータを用意したい人は下記コマンドで愛知県の境界データがダウンロードできます。

$ wget -O A002005212015DDSWC23.zip "https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212015&code=23&coordSys=1&format=shape&downloadType=5"
$ unzip A002005212015DDSWC23.zip

使い方

さきほどダウンロードしたe-statのデータの場合、こんな感じです。

$ shp2mysql -s 4612 -W CP932 h27ka23.shp > h27ka23.sql

生成されたh27ka23.sqlをmysqlコマンドを使って実行(インポート)します。
ファイル名でテーブルが作られて、データがインサートされます。

$ mysql -u データベースのユーザ名 -p データベース名 < h27ka23.sql

インサートされたデータを見てみます。

$ mysql -u データベースのユーザ名 -p データベース名
mysql> SELECT
    -> pref, city, s_area, pref_name, city_name, s_name,
    -> ST_AsText(geom), ST_SRID(geom)
    -> FROM h27ka23 LIMIT 1;

実行結果はこんな感じです。

| pref | city | s_area | pref_name | city_name | s_name             | ST_AsText(geom)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | ST_SRID(geom) |
+------+------+--------+-----------+-----------+--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------+
| 23   | 101  | 001005 | 愛知県    | 千種区    | 青柳町5丁目       | MULTIPOLYGON(((35.160771346643 136.938842145444,35.1608301437881 136.938424291226,35.1608501173003 136.938334470847,35.1610470210929 136.938370604812,35.1610455594512 136.938417110451,35.1612019205203 136.938464933458,35.16155916329 136.938529179109,35.1615545646458 136.938555475691,35.1617364712544 136.938598441145,35.161741167614 136.938548840332,35.161911770243 136.93857200556,35.1619180171412 136.938523470471,35.1623067540192 136.938606284437,35.1622885707429 136.938711581907,35.1622335970064 136.939177415621,35.1621481339206 136.939721847138,35.1617339281151 136.939613455624,35.1617441005151 136.93955496258,35.1614778024844 136.939500052065,35.161417934312 136.939533684759,35.1606909879029 136.93936841024,35.160771346643 136.938842145444))) |          4612 |

MySQL Workbenchを使うと冒頭の通り、インポート結果を図で確認できます。

スクリーンショット 2019-12-30 21.53.45.png

属性データもインポートされていることが確認できます。国勢調査のデータなのでエリアごとの人口なども確認できます。

スクリーンショット 2019-12-30 21.59.46.png

最後に

shp2mysqlのことでおかしな動作や気づいた点があればコメント欄等でぜひ教えて下さい。

この記事のライセンス

クリエイティブ・コモンズ・ライセンス
この記事はCC BY 4.0(クリエイティブ・コモンズ 表示 4.0 国際 ライセンス)の元で公開します。

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

仮想環境に MySQL をインストールした

1年以上前から下書きに温めていた記事を、mac購入記念に完成させました?
とても今さらな内容になってしまいましたが、mysqlの環境が構築できて嬉しいです。

仮想環境 とは

通常、ひとつのコンピュータ(ハード)にはひとつのOSがはいっていて、
そこにいろいろなアプリをインストールしてつかっています。

通常環境.png

わたしの環境を例にあげると以下のようになります。

ハード : MacBook
OS  : macOS
アプリ : Slack, SublimeText, PHPStorm ...

OSには Windows, macOS, Linux, UNIX などさまざまありますが、
今回は Linux のひとつである CentOS に MySQL をインストールしてみたいと思います。

しかしわたしの既存のOSは macOS なので、 CentOS をつかうためには 仮想環境 が必要です。
仮想化することで、ひとつのコンピュータで複数のOSを扱えるようになります。

仮想環境.png

仮想化ソフトには代表的なものとして Vmware や VirtualBox があります。
今回は VirtualBox をつかっていきます!

VirtualBox とは

virtualbox.png

  • オープンソースの仮想化ソフトウェアのひとつ
  • ゲストOS(仮想環境にインストールしたOS)として                Windows, macOS, Linux, Solaris などさまざまなOSをいれることができる

VirtualBox は本来、複雑なコマンドで仮想環境の設定を行っていきますが、
Vagrant というソフトをつかうことで簡単なコマンドで設定を行うことができます!

Vagrant とは

vagrant.png

  • 簡単にいうと 仮想化ソフトの設定を簡単に行うことができる「仮想化カンタンツール」
  • VirtualBox だけでなく、VMware や EC2 でもつかうことができる

実際に環境をつくる

改めて、現状の環境、つくりたい環境はそれぞれ以下のようになっています。

つくりたい環境.png

VirtualBox をインストール

https://www.virtualbox.org/

virtualbox.png

2019年12月時点で、6.1.0 まで公開されていましたが、
Vagrantの最新バージョンに対応していないのか、
vagrant up 時に以下のようなエラーが出てしまいました。

No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.

If you believe you already have a provider available, make sure it
is properly installed and configured. You can see more details about
why a particular provider isn't working by forcing usage with
vagrant up --provider=PROVIDER, which should give you a more specific
error message for that particular provider.

5.2 をダウンロードしたところ、無事成功しました!
https://www.virtualbox.org/wiki/Download_Old_Builds

Vagrant をインストール

https://www.vagrantup.com/

vagrant.png

VagrantでCentOS7の仮想環境をつくる

ディレクトリを作成し移動

$ mkdir centos7
$ cd centos7

CentOS7のboxを追加

$ vagrant box add centos/7

==> box: Loading metadata for box 'centos/7'
box: URL: https://vagrantcloud.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop

# virtualbox を選択
$ Enter your choice: 3
$ vagrant init

Vagrantfileのbox名を変更

15行目のbox名を、指定したbox名に変更します。

$ vi Vagrantfile

config.vm.box = "centos/7"

仮想サーバーを起動・接続

$ vagrant up
$ vagrant ssh

CentOS7 に MySQL をインストール

[vagrant@localhost ~]$ sudo yum install mysql-server

CentOS7にデフォルトではいっているmariaDBを削除する

[vagrant@localhost ~]$ sudo yum remove mariadb-libs
[vagrant@localhost ~]$ rm -rf /var/lib/mysql/

http://monakaice88.hatenablog.com/entry/2016/10/30/101409

公式リポジトリをインストール

[vagrant@localhost ~]$ sudo rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

mysql をインストール

[vagrant@localhost ~]$ sudo yum install --enablerepo=mysql57-community mysql-community-server

完了したら、バージョンを確認しましょう!

[vagrant@localhost ~]$ mysqld --version
mysqld  Ver 5.7.28 for Linux on x86_64 (MySQL Community Server (GPL))

上記のように表示されれば成功です✊

mysql を起動

[vagrant@localhost ~]$ sudo systemctl start mysqld.service

mysql のセキュリティ設定

/var/log/mysqld.log のなかに初期パスワードがかいてあるので、確認します。

[vagrant@localhost ~]$ sudo cat /var/log/mysqld.log | grep password

下記コマンドで、パスワードなどを設定します!

[vagrant@localhost ~]$ mysql_secure_installation

mysql に接続

[vagrant@localhost ~]$ mysql -u root -p
Enter password: {設定したパスワード}

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.28 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

このように表示されれば成功です⭐️

参考

わたくしごと

DBA目指して勉強中...

  1. MySQL について
  2. MySQL のインストール ◀ これ
  3. my.cnf について 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Capistranoでの自動デプロイでエラーが起きた際の対処方法

この記事について

 この記事では、自身がRailsで開発しているアプリをCapistranoでデプロイをしようとした時にエラーが発生し、解決するまでに試した作業を書いています。
 同様のエラーが起きた際に自分が読み返すために書いていますが、他の方の参考にもなれば嬉しいです。

エラーが起こった時の状況

 Capistranoでデプロイの流れを自動化しており、ある日デプロイをしようとしたところ、deploy:migrating実行時にエラーが発生し、デプロイができませんでした。
 ローカル環境では動作に問題がなかったため、サーバー環境に問題があると考えました。

エラー解決までに行った作業

  • AWSサービスの再起動
  • unicornの再起動
  • nginxの再起動
  • MySQLの再起動

 こうして書いてみると、ひたすら再起動しているだけのような気がしてきました。

1.AWSサービスの再起動

 amazonコンソールからサインインし、EC2インスタンスの管理画面を開きます。
 該当するアプリが選択された状態で、「アクション→インスタンスの状態→停止」、「アクション→インスタンスの状態→開始」の順で行います。
 再起動を選択しても良さそうですが、学習のために開発中のアプリであることと、再起動で上手く行かなかった時に停止→開始とやり直すのが面倒だったため、今回は最初から停止→開始の作業を行いました。
 他のアプリを開発中にも直面しましたが、解決策が分からない時にインスタンスの再起動を行うとあっさり解決することがあったりします。

2.unicornの再起動

 以降はコンソールからサーバーにログインした上で作業を行います。cd /var/www/アプリ名などを実行し、アプリが保存されているフォルダに移動してから作業してください。

unicornの停止
ps aux | grep unicorn  # 起動中のunicornプロセスを確認

# 起動中のunicorn master -c ...がある場合、停止させる
kill 0000 #上記で確認したプロセス番号を入力
unicornの起動
RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D

3.nginxの再起動

nginxの再起動
# nginxの停止
sudo service nginx stop

# nginxの開始
sudo service nginx start

# nginxの状況確認
sudo service nginx status
# -> nginx (pid 0000) is running...

4.MySQLの再起動

MySQLの再起動
sudo service mysqld restart
# nginxと同様の作業でも再起動は可能

結果

 以上の作業を行うことで、無事にデプロイが行えるようになりました。
 上の作業を全て連続して行ったため、具体的にどの部分が原因でデプロイできなかったのかまでは分かりませんでした。ですが原因を追求するつもりもありませんでしたし、問題があった時の再起動は不都合がない限り全て行って差し支えないと考えます。

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

SQL備忘録

ORDER BY

ソートをする
SELECT * FROM tables ORDER BY 対象カラム
昇順にしたいとき
SELECT * FROM tables ORDER BY 対象カラム ASC
降順にしたいとき
SELECT * FROM tables ORDER BY 対象カラム DESC

演算

合計値を出す
SELECT SUM(対象カラム) FROM tables
件数を出す
SELECT COUNT(対象カラム) FROM tables
最大値を出す
SELECT MAX(対象カラム) FROM tables
最小値を出す
SELECT MIN(対象カラム) FROM tables
平均値を出す
SELECT AVG(対象カラム) FROM tables

リレーション

リレーションを張るには対象のテーブルに同じデータを投入しておく必要がある(カラム名は異なっても可)

内部結合

片方のテーブルにデータが無いと、もう一方のデータは表示されなくなる
FROM句にテーブルをカンマ区切りで並べる

 外部結合

全てのデータを見たいテーブルを軸にする
FROM 主テーブル RIGHT JOIN 従テーブル ON リレーションの条件
FROM 主テーブル LEFT JOIN 従テーブル ON リレーションの条件

GROUP BY

○○ごとに集計をしたい時に、GROUP BY句に○○を指定する。
リレーションの後に記述する
SELECT item_id,SUM(sales) FROM tables GROUP BY item_id

LIMIT

3件取得
SELECT * FROM tables LIMIT 3
2件目から3件取得
SELECT * FROM tables LIMIT 2,3

DISTINCT

値の重複を失くしたい時に使う
SELECT DISTINCT(対象カラム) FROM tables;

BETWEEN

SELECT * FROM tables WHERE age>=20 AND age<31
SELECT * FROM tables WHERE age BETWEEN 20 AND 30
上記2つは同じSQL
BETWEENを使う場合は〇〇以下という指定になる

IN

SELECT * FROM tables WHERE id=1 OR id=10
SELECT * FROM tables WHERE id IN(1,3)
上記2つは同じSQL

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

[2−1]作成したQRコードを読み取り識別する

この記事は"QRコードを使った入場システムを自作する"シリーズの記事です。

前回

"[1]独自のフォーマットに基づいてQRコードを発行する"では独自のフォーマットのQRコードを発行してデータベースに登録することができました。
今回はデータベースに登録したQRコードの読み取り方です。

QRコードを読み取るには

スキャナーを用意する予算がなかったのiOSアプリのPythonista3を利用してQRコードを読み取ります。

手順

Pythonista3を利用しなくてもなんでも読み取った後の処理は同じです。

  • QRコードをスキャン
  • 読み取ったコードを文字列に変換
  • MySQLで検索をかける

Pythonista3でQRコードを読み取る方法

今回一番きつかったのがこの部分で、objective-cをPython上で動かさなければいけませんでした。
Pythonistaには標準でobjc_utilというモジュールが入っているのでそれを利用します。

とは言っても...

objective-cなんか生まれてから一度も利用したことがなくswiftが主流?になってきているので今回はこちらを流用させていただいた。(一部改変)

ということで

以下がソースコードになる。

QRscanner1.py
# Barcode scanner demo for Pythonista

from objc_util import *
from ctypes import c_void_p
import mysql.connector as testdb
import ui
import sound


found_codes = set()
main_view = None

AVCaptureSession = ObjCClass('AVCaptureSession')
AVCaptureDevice = ObjCClass('AVCaptureDevice')
AVCaptureDeviceInput = ObjCClass('AVCaptureDeviceInput')
AVCaptureMetadataOutput = ObjCClass('AVCaptureMetadataOutput')
AVCaptureVideoPreviewLayer = ObjCClass('AVCaptureVideoPreviewLayer')
dispatch_get_current_queue = c.dispatch_get_current_queue
dispatch_get_current_queue.restype = c_void_p

#QRコードの読み取り
def captureOutput_didOutputMetadataObjects_fromConnection_(_self, _cmd, _output, _metadata_objects, _conn):
    objects = ObjCInstance(_metadata_objects)
    for obj in objects:
        s = str(obj.stringValue())
        if s not in found_codes:
            found_codes.add(s)
    #読み取り終了後にWindowを閉じる。
    main_view.close()

MetadataDelegate = create_objc_class('MetadataDelegate', methods=[captureOutput_didOutputMetadataObjects_fromConnection_], protocols=['AVCaptureMetadataOutputObjectsDelegate'])

@on_main_thread
def main():
    global main_view
    delegate = MetadataDelegate.new()
    main_view = ui.View(frame=(0, 0, 400, 400))
    main_view.name = 'Barcode Scanner'
    session = AVCaptureSession.alloc().init()
    device = AVCaptureDevice.defaultDeviceWithMediaType_('vide')
    _input = AVCaptureDeviceInput.deviceInputWithDevice_error_(device, None)
    if _input:
        session.addInput_(_input)
    else:
        print('Failed to create input')
        return
    output = AVCaptureMetadataOutput.alloc().init()
    queue = ObjCInstance(dispatch_get_current_queue())
    output.setMetadataObjectsDelegate_queue_(delegate, queue)
    session.addOutput_(output)
    output.setMetadataObjectTypes_(output.availableMetadataObjectTypes())
    prev_layer = AVCaptureVideoPreviewLayer.layerWithSession_(session)
    prev_layer.frame = ObjCInstance(main_view).bounds()
    prev_layer.setVideoGravity_('AVLayerVideoGravityResizeAspectFill')
    ObjCInstance(main_view).layer().addSublayer_(prev_layer)
    session.startRunning()
    main_view.present('sheet')
    main_view.wait_modal()
    session.stopRunning()
    delegate.release()
    session.release()
    output.release()
    #QRコードを読み取った際の処理
    if found_codes:
        #cur = conn.cursor()

        scan_code = str(''.join(found_codes))

        #table: QRidのデータを照合
        table = 'QRid'
        cur.execute("select * from QRid where QR=%s",(scan_code,))

        result = cur.fetchall()

        if len(result) == 0:
            sound.play_effect('digital:PhaserUp4')
            print('該当するデータがありません。')
            vibrate([50,0,50,0,50,0,50])

        else:
            sound.play_effect('arcade:Coin_5')
            print('ID'+'{:>15}'.format('DATE')+'{:>11}'.format('TIME'))
            for i in result:
                print(*i)


if __name__ == '__main__':
    #MySQLへ接続
    conn = testdb.connect(
        user = 'test', 
        password = '12345', 
        host = '192.168.x.x',
        port = '3306',
        database='QRtest'
    )

    #接続ステータスを確認
    conn.ping(reconnect=True)
    print('[Status] ', end='')
    print(conn.is_connected())

    cur = conn.cursor()

    main()

    #MySQLへの接続を終了
    cur.close()
    conn.commit()
    conn.close()

スクリプトを走らせるとカメラウィンドウが表示されます。
IMG_4029.PNG
正常に読み取られるとこのウィンドウが閉じてコンソールが開きます。
IMG_4028.PNG
MySQL上に登録されている情報が表示されれば成功です。
スクリーンショット 2019-12-30 15.05.38.png

次回予告

[2-2]作成したQRコードを読み取り識別する。でよりわかりやすいGUIを追加します。読み取り機は次回で完成です。
IMG_3969.PNG

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

インデックスマージで非効率なインデックスが選択されることがある

MySQL (Amazon RDS) でスロークエリ対策した際のノート。

MySQLではクエリオプティマイザがクエリ実行計画を立てる際に、絞り込み効果の低い列 (例えばレコード全体の20-30%以上が該当する場合など) に付けられたインデックスを使用することは通常ありません。

例えば 1, 2 二つの値しか持たないようなカラムに付けられたインデックスが存在していても、通常テーブルスキャンが選択されます。(そちらのほうが早いので)

しかしながら、インデックスマージでは、選択性の低いカラムのインデックスが使用されてしまい、結果的にパフォーマンスの大幅な低下を招くケースがありました。

https://dev.mysql.com/doc/refman/5.6/ja/index-merge-optimization.html

SQLとクエリ実行プラン

SQL

SELECT MAX( create_timestamp )
FROM foobars
WHERE ( 
    foobars.valid_flag = '0' 
    AND foobars.spec_id IN ( '3', '5', '6', '7', '8', '9' ) 
    AND foobars.group_id = '622' 
    AND foobars.status_flag = '1' 
    );

実行プラン

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE foobars NULL index_merge group_id,spec_id,status_flag,valid_flag group_id,status_flag,valid_flag 4,1,1 NULL 4804 100.00 Using intersect(group_id,status_flag,valid_flag); Using where

valid_flagは値が 1, 2 の2種類しか存在しない列で、全体の95%以上が 1 です。抽出条件として 2 を選択するケースは、システム管理でごくまれに発生するだけであり、なおかつ他のカラムに付けられたインデックスで十分検索対象を絞り込めることもあり、このカラムに対する単独のインデックスは全く不要です。

foobarsテーブルのレコード数は合計数百万件あります。
今回のケースでは、valid_flagセカンダリインデックスをスキャンして集めた数百万件 (の95%程度) のPKを他のセカンダリインデックス (group_id, status_flag) をスキャンして集めたPKのリストと突き合わせる、という処理が内部的に行われていたと思われます。
これではクエリも遅くなるはずです。

対策

  • valid_flagカラムに付けられた単独のインデックスは削除します。存在しても使われることがないばかりか、インデックスマージに混ぜ込まれてパフォーマンスの低下を招きます。
ALTER TABLE foobars DROP INDEX `valid_flag`;

この時点ですでに十分パフォーマンスが改善しました。

  • ついでに複合インデックスを作成します。しかもカバリングインデックスにしました。
    • このSELECTクエリはかなりの数が発行されており、レコードの作成よりも読み取り時に発生する負荷のほうがはるかに大きいです。
    • インデックスの最初の方に、他のクエリでも使用されるカラムを並べ、後ろの方にこのクエリのためのカラムを並べています。
ALTER TABLE foobars ADD INDEX `idx_group_spec_flag` (`group_id`, `spec_id`, `valid_flag`, `status_flag`, `create_timestamp`);

結論

低カーディナリティのカラムに付けられた、どう考えても役に立たないインデックス達。

あっても害はないように思えますが、INSERT/UPDATE 時のパフォーマンスに影響を与えるほか、インデックスマージに混ぜ込まれてパフォーマンスの大幅な低下を招くことがあります。

まぁいっか、で済まさず見つけたら削除しましょう!

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

【初心者向け入門】PythonでMySQLを扱う

1. はじめに

今回はPythonでMySQLを扱う方法を記載する.

実行環境

OS

  • macOS Catalina 10.15.2

macでMySQLを使えるようにする

参考:PythonでMySQLに接続する方法【初心者向け】

(前提:Pythonが使える,pipコマンドが使える,brewコマンドが使える)
1. ターミナルでpip install mysqlclientと入力し,MySQLをインストール.
2. ターミナルでbrew install mysql-connector-cと入力し,MySQLへアクセスできるようにする.

2. ソースコード

2.1. 接続と切断

#----------------
#標準ライブラリ
#----------------
#import pymysql.cursors #Raspberry Pi用
import MySQLdb          #Win,mac用


#---------
# 接続
#---------
#cnct = pymysql.connect( #Raspberry Pi用
cnct = MySQLdb.connect(  #Win,mac用
    host = "localhost",  #ホスト名
    user = "root",       #MySQLユーザ名
    password = "",       #MySQLユーザパスワード
    db = "test",         #データベース名
    charset = "utf8"     #文字コード
    )
TABLE = "test"           #テーブル名

cur = cnct.cursor()


#---------
# ここでデータベースの操作を行う
#---------


#---------
# 切断
#---------

cur.close()
cnct.close()

2.2. データの取得と表示

cur.execute("SELECT * FROM " + TABLE + ";") #SQLのコマンド
results = cur.fetchall()                    #結果をresultに格納
print("全て表示")
print(results)
print("\n")

print("1行ずつ表示")
for r in results:
    print(r) # r は配列なので,要素単位で表示する場合はインデックスを指定すれば良い.例:print(r[0])

if文でデータがあるかないかを表示したい場合

cur.execute("SELECT * FROM " + TABLE + ";")
results = cur.fetchall()
if results: #配列resultsの中にデータが存在する
    print("データあり")
    print(results)
else:       #配列resultsの中にデータが存在しない(配列が空)
    print("データなし")

2.3 データの追加

#データの追加
cur.execute("INSERT INTO " + TABLE + " " + ROW + " VALUES (%s,%s);", ("test1","test2"))
cur.execute("INSERT INTO " + TABLE + " " + ROW + " VALUES (%s,%s);", ("test3","test4"))
cnct.commit()   #データベースに加えた変更を保存.これがないとMySQLに反映されない.

2.4. データの削除

cur.execute("DELETE FROM " + TABLE + ";") #全データ削除.削除データを指定する場合は,WHERE句で指定
cnct.commit()   #データベースに加えた変更を保存.これがないとMySQLに反映されない.

2.5. 全て

#----------------
#標準ライブラリ
#----------------

#import pymysql.cursors #Raspberry Pi用
import MySQLdb


#----------------
#データベース接続
#----------------

#cnct = pymysql.connect( #Raspberry Pi用
cnct = MySQLdb.connect(
    host = "localhost",
    user = "root",
    password = "",
    db = "test",
    charset = "utf8"
    )
TABLE = "test"
ROW = "(data1,data2)" #追加するデータの列を指定するため

cur = cnct.cursor()


#----------------
#データベース操作
#----------------

#データの追加
cur.execute("INSERT INTO " + TABLE + " " + ROW + " VALUES (%s,%s);", ("test1","test2"))
cur.execute("INSERT INTO " + TABLE + " " + ROW + " VALUES (%s,%s);", ("test3","test4"))
cnct.commit()   #データベースに加えた変更を保存

#データの取得・表示
cur.execute("SELECT * FROM " + TABLE + ";")
results = cur.fetchall()
print("全て表示")
print(results)
print("\n")

print("1行ずつ表示")
for r in results:
    print(r) # r は配列なので,要素単位で表示する場合はインデックスを指定すれば良い.例:print(r[0])

"""
#データの削除
cur.execute("DELETE FROM " + TABLE + ";") #全データ削除.削除データを指定する場合は,WHERE句で指定
cnct.commit()   #データベースに加えた変更を保存


print("\n") #2行改行する.1行だけ改行する場合は print() と指定


#データの取得・表示
cur.execute("SELECT * FROM " + TABLE + ";")
results = cur.fetchall()
if results:
    print("データあり")
    print(results)
else:
    print("データなし")
"""

#----------------
#データベース切断
#----------------

cur.close()
cnct.close()



""" ターミナルでMySQL操作

MySQLの起動
$ mysql.server start

MySQL接続
$ mysql -u root

MySQLの終了
$ mysql.server stop


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