執筆者 那須野 薫
本節では、データベース(特にMySQL)によるデータ管理について説明します。
データベースに関して概説し、Terminalからの操作方法、Pythonからの操作方法を説明します。
データベースとは、色々なデータの目的ベースでの管理や、効率的なデータ参照/検索を可能にするものです。
データベースの中には複数のテーブルがあります。
テーブルはちょうどスプレッドシートのようになっていて、それぞれの列に名前があり、1行が1つのデータとなるイメージです。
例えば、Twitterのツイートデータを扱いたい場合はツイートのテーブルとユーザのテーブルを用意して、
ツイートテーブルには、ツイートIDやユーザID、ツイート本文、投稿日時などのカラム(列)を用意して、
ユーザテーブルには、ユーザIDやユーザ名、スクリーン名などのカラム(列)を用意して、
それぞれのテーブルの1行が1ツイート、1行が1ユーザを表すように設計・利用されます。
Twitterのデータにはこの他にもフォロー関係やリストなど色々なデータがありますが、このように多様なデータを扱う際はデータベースをよく使います。
リレーショナルデータベースであるMySQLの基本的な操作方法について列挙します。
ここでは、下記の3つについて基本的な操作方法を説明します。
MySQLの操作にはSQLクエリというものを使用して行います。
下記のコマンドをひとつずつ実行して挙動を確認してみてください。
なお、
TerminalからのMySQLの操作は下記のコマンドを打ち、パスワードを入力することで行えるようになります。
$ mysql -u username -p databasename
SQLクエリの大文字小文字の区別はされないものと考えてください。
データベースの一覧を表示するクエリ。
mysql> SHOW DATABASES;
twitterという名前のデータベースを作成するクエリ。
mysql> CREATE DATABASE twitter;
twitterという名前のデータベースを利用データベースに選択するクエリ。
mysql> USE twitter;
twitterという名前のデータベースを削除するクエリ。
mysql> DROP DATABASE twitter;
テーブル一覧を表示するクエリ。
mysql> SHOW TABLES;
tweetsという名前のテーブルを作成するクエリ。
カラムは
の4つとする。
mysql> CREATE TABLE tweets (
tweet_id BIGINT,
user_id BIGINT,
text LONGTEXT,
created_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
tweetsという名前のテーブル構造を表示するクエリ。
mysql> SHOW FIELDS FROM tweets;
tweetsという名前のテーブルのカラムtextの型を変更するクエリ。
mysql> ALTER TABLE tweets MODIFY text VARCHAR(1023);
カラム名を修正するクエリ。
mysql> ALTER TABLE tweets CHANGE tweet_id status_id BIGINT;
カラム名を追加するクエリ。
mysql> ALTER TABLE tweets ADD retweeted_count INT;
インデックスを追加するクエリ。
mysql> ALTER TABLE tweets ADD INDEX(user_id);
tweetsという名前のテーブルをなかみやパラメタを削除し初期化するクエリ。
mysql> TRUNCATE TABLE tweets;
tweetsという名前のテーブルを作成するクエリを表示するクエリ。
mysql> SHOW CREATE TABLE tweets;
tweetsという名前のテーブル構造と同じ構造のtweets2というテーブルを作成するクエリ。
mysql> CREATE TABLE tweets2 LIKE tweets;
tweetsという名前のテーブルを削除するクエリ。
mysql> DROP TABLE tweets;
テーブルにデータを1行追加するクエリ。
mysql> INSERT INTO tweets (tweet_id, user_id, text, created_at) VALUES(38279338, 843789, '(^ ^ ;;;', '2014-02-25 15:57:17') ;
テーブルから全てのカラムについて、全ての行のデータを取得するクエリ。
mysql> SELECT * FROM tweets;
テーブルから選択したカラムについて、全ての行のデータを取得するクエリ。
mysql> SELECT tweet_id, user_id FROM tweets;
テーブルから全てのカラムについて、条件に合致した全ての行のデータを取得するクエリ。
mysql> SELECT * FROM tweets WHERE user_id = 4873438;
テーブルから全てのカラムについて、全ての行のデータを並び替えて取得するクエリ。
mysql> SELECT * FROM tweets ORDER BY created_at;
テーブルから全てのカラムについて、最初の100行のデータを取得するクエリ。
mysql> SELECT * FROM tweets LIMIT 100 ;
テーブルから特定のカラムについて、条件に合致した行のデータを並び替えて最初の100行のデータを取得するクエリ。
mysql> SELECT user_id, created_at FROM tweets WHERE created_at > '2013-01-01 00:00:00' AND created_at <= '2013-04-01 00:00:00' ORDER BY created_at LIMIT 100 ;
条件に合致したデータを更新するクエリ。
mysql> UPDATE tweets SET text = 'hoge' WHERE tweet_id = 7593827;
条件に合致したデータを更新するクエリ。
mysql> DELETE FROM tweets WHERE tweet_id = 7593827;
Terminalからmysqlコマンドで操作する代わりに、Pythonプログラムを通して操作することもできます。この方法には、プログラム側との連携がしやすいという長所があります。
PythonからMySQLに接続して操作するためには接続用のモジュールを利用します。
接続用のモジュールはいくつかありますが、ここでは、著者がよく使うmysql-connector-pythonというモジュールについて説明します。
module名はmysql.connector
です。インストールされていない場合は下記の方法でインストールしてください。
$ wget http://cdn.mysql.com/Downloads/Connector-Python/mysql-connector-python-1.1.6.zip
$ unzip mysql-connector-python-1.1.6.zip
$ cd mysql-connector-python-1.1.6/
$ sudo python setup.py install
まず、接続用の情報を、変数として宣言します。新しくディレクトリ(フォルダ)を作り、その中にconfig.pyというファイルを作ります。
config.pyの内容は、下記のようにしてください。
# coding: utf-8
user = 'root'
host = '127.0.0.1'
passwd = 'password' # mysqlのrootユーザのパスワード
db = 'RCData' # 利用したいデータベースの名前
続けて、本体となる、MySQLへの接続するプログラムを書きます。
config.pyと同じディレクトリ(フォルダ)に、もう一つ好きな名前で、’.py’ファイルを作ってください。
#coding: utf8
import mysql.connector
import config
dbcon = mysql.connector.connect(
database=config.db,
user=config.user,
password=config.passwd,
host=config.host
)
これで、変数dbconに、データベース操作用のプログラム(オブジェクト)が読み込まれました。
さらに、dbconは、config.pyで指定したデータベースに接続されています。
このdbconを通して、PythonからMySQLを操作することができるようになりました。
以下、
import config
の行が含まれるプログラムは、config.pyと同じディレクトリにおいて、動かしてください。
#coding: utf8
import mysql.connector
import config
dbcon = mysql.connector.connect(database=config.db, user=config.user, password=config.passwd, host=config.host)
dbcur = dbcon.cursor()
#指定のuser_idのデータを取得する
user_id = 1234567
dbcur.execute(''' SELECT tweet_id, text, created_at FROM tweets WHERE user_id = %s ''',(user_id,))
for row in dbcur.fetchall():
print row
#row[0]にはtweetsテーブルのidカラムの値が入る
#row[1]にはtweetsテーブルのtextカラムの値が入る
#row[2]にはtweetsテーブルのcreated_atカラムの値が入る
#coding: utf8
import mysql.connector
import config
dbcon = mysql.connector.connect(database=config.db, user=config.user, password=config.passwd, host=config.host)
dbcur = dbcon.cursor()
dataset = [
(138297393, '^_^', 38979),
(298379847, '(- - ;)', 38979),
(928398329, '((o_o;;;)))))', 88298),
(382809389, 'm(__)m', 113918),
]
#複数データの追加
for data in dataset:
dbcur.execute(''' INSERT INTO tweets (tweet_id, text, user_id) VALUES(%s, %s, %s) ''', (data,))
#実際にMySQLに反映させる
dbcon.commit()
データ参照/追加の操作と同様に、SQLクエリを書いてexecuteしてください。
データベース=関係データベースとか、
データベース=MySQLとか、
そういう扱いしてますが、
初学者向けなのでそこは勘弁。