のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

MySQLをPythonから弄る

皆さんこんにちは
お元気ですか。私は元気です。

さて、今まで掲載していた記事では全てConsoleから弄っていたのですが、
プログラムできないと不便でございます。

MySQLをプログラムから弄ることができます。さて、必要なパッケージをpipを使ってインストールします。

インストール

pip install mysql-python

実際の例

まずは、実際の例を見て行きましょう。

#coding:utf-8
import MySQLdb

""" データベースに接続する """
connector = MySQLdb.connect(host="localhost",
	db="tests", user="wwww", passwd="xxxx", charset="utf8")

""" テーブルを作る """
cursor = connector.cursor()
sql = "CREATE TABLE test_table(id INT NOT NULL,content TEXT)"
cursor.execute(sql)
""" データベースに情報を格納する """
sql = "INSERT INTO test_table VALUES(1,'python')"
cursor.execute(sql)

data = (2,"C")
statement = "INSERT INTO test_table VALUE(%s, %s)"
cursor.execute(statement,data)

dataset = [
  (3, "Java"),
  (4, "C++"),
  (5, "Ruby"),
]

statement = "INSERT INTO test_table VALUES(%s, %s)"
cursor.executemany(statement, dataset)

""" データベースに格納したデータを取得する。 """
cursor.execute("select * from test_table")
result = cursor.fetchall()

for row in result:
	print row

""" テーブルを廃棄する """
cursor.execute("DROP TABLE test_table")

基本的にカーソルを取得して、

sql = "CREATE TABLE test_table(id INT NOT NULL,content TEXT)"
cursor.execute(sql)

sql文を作って、実行すれば問題ありません。DROP TABLEとかも問題なく動作します。

レコードを挿入

レコードの挿入ですが、prepared statementみたいな使い方をすれば以下のようにできます。

data = (2,"C")
statement = "INSERT INTO test_table VALUE(%s, %s)"
cursor.execute(statement,data)

複数まとめてでコミットする場合は

dataset = [
  (3, "Java"),
  (4, "C++"),
  (5, "Ruby"),
]

statement = "INSERT INTO test_table VALUES(%s, %s)"
cursor.executemany(statement, dataset)

SELECTの結果を取得する

cursor.execute("select * from test_table")
result = cursor.fetchall()

for row in result:
	print row

fetchall()で結果を取得することができます。それをfor文で回して結果を取得しています。

MySQL INNER_JOIN と OUTER_JOIN

皆さんこんにちは
お元気ですか。私は実家に帰っております。

本日はMySQLでJOINを行います。JOINとはテーブルを結合する操作ですが、結合方法には様々な形式がございます。
今回2つのテーブルを用意しました。customerテーブルとcountryテーブルです。

mysql> SELECT * FROM customer;
+----+---------------+------------+
| id | name          | country_id |
+----+---------------+------------+
|  1 | yamada taro   |          1 |
|  2 | yamada hanako |          2 |
|  3 | yamada jiro   |          2 |
|  4 | yamada saburo |          4 |
|  5 | yamada shiro  |       NULL |
+----+---------------+------------+

mysql> SELECT * FROM country;
+------------+---------------+
| country_id | country_name  |
+------------+---------------+
|          1 | Japan         |
|          2 | China         |
|          3 | United States |
|          4 | India         |
+------------+---------------+

内部結合

どちらにも存在するレコードを取得します。
記載方法の一般化ですが、SELECT * FROM [table名] INNER JOIN [結合したいtable名] ON [条件]

mysql> SELECT * FROM customer INNER JOIN country ON customer.country_id = country.country_id;
+----+---------------+------------+------------+--------------+
| id | name          | country_id | country_id | country_name |
+----+---------------+------------+------------+--------------+
|  1 | yamada taro   |          1 |          1 | Japan        |
|  2 | yamada hanako |          2 |          2 | China        |
|  3 | yamada jiro   |          2 |          2 | China        |
|  4 | yamada saburo |          4 |          4 | India        |
+----+---------------+------------+------------+--------------+

右外部結合

中心に結合します。
右側にあるものは全て左に結合し、ないものについてはNULLと結合します。

一般化:SELECT * FROM [table名] RIGHT OUTER JOIN [結合したいtable名] ON [条件]

mysql> SELECT * FROM customer RIGHT OUTER JOIN country ON customer.country_id = country.country_id;
+------+---------------+------------+------------+---------------+
| id   | name          | country_id | country_id | country_name  |
+------+---------------+------------+------------+---------------+
|    1 | yamada taro   |          1 |          1 | Japan         |
|    2 | yamada hanako |          2 |          2 | China         |
|    3 | yamada jiro   |          2 |          2 | China         |
|    4 | yamada saburo |          4 |          4 | India         |
| NULL | NULL          |       NULL |          3 | United States |
+------+---------------+------------+------------+---------------+
5 rows in set (0.00 sec)

左外部結合

先程とは逆に左側に記載したテーブルを基準に結合する。

一般化:SELECT * FROM [table名] LEFT OUTER JOIN [結合したいtable名] ON [条件]

mysql> SELECT * FROM customer LEFT OUTER JOIN country ON customer.country_id = country.country_id;
+----+---------------+------------+------------+--------------+
| id | name          | country_id | country_id | country_name |
+----+---------------+------------+------------+--------------+
|  1 | yamada taro   |          1 |          1 | Japan        |
|  2 | yamada hanako |          2 |          2 | China        |
|  3 | yamada jiro   |          2 |          2 | China        |
|  4 | yamada saburo |          4 |          4 | India        |
|  5 | yamada shiro  |       NULL |       NULL | NULL         |
+----+---------------+------------+------------+--------------+
4 rows in set (0.00 sec)

MySQL のテーブル操作(INSERT,SELECT,UPDATE,DELETE)

皆さんこんにちは
お元気ですか。今日はやっと実家に帰るよ。やったね!

今日はMySQLの基本的なテーブル操作を見ていこうと思います。
いや、本当に基本的です。はい

テーブルの生成(CREATE TABLE)

試しにテーブルを生成します。

CREATE TABLE IF NOT EXISTS customer(id INT NOT NULL,name TEXT,address TEXT);

挿入(INSERT)

テーブルにレコードを挿入します。

INSERT INTO customer VALUES('1','yamada taro','北海道1-1-1');
INSERT INTO customer(id,name) VALUES('1','yamada taro');

全てを入力するときにはカラムの指定は必要ありません。

選択(SELECT)

テーブルからレコードを抽出します。全体を抽出するときは*を使いましょう

mysql> SELECT * FROM customer;
+----+-------------+----------------+
| id | name        | address        |
+----+-------------+----------------+
|  1 | yamada taro | 北海道1-1-1    |
|  1 | yamada taro | NULL           |
+----+-------------+----------------+

一部分だけ抽出するときはカラムを入力します。

mysql> SELECT id,name FROM customer;
+----+-------------+
| id | name        |
+----+-------------+
|  1 | yamada taro |
|  1 | yamada taro |
+----+-------------+

更新(UPDATE)

カラムの指定の方法はWHEREで行い、SETもします。

mysql> UPDATE customer SET address = '沖縄' WHERE address IS NULL;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM customer;
+----+-------------+----------------+
| id | name        | address        |
+----+-------------+----------------+
|  1 | yamada taro | 北海道1-1-1    |
|  1 | yamada taro | 沖縄           |
+----+-------------+----------------+
2 rows in set (0.00 sec)

削除(DELETE)

基本的にWHEREで削除する箇所を指定します。

mysql> DELETE FROM customer WHERE address = '沖縄';
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM customer;
+----+-------------+----------------+
| id | name        | address        |
+----+-------------+----------------+
|  1 | yamada taro | 北海道1-1-1    |
+----+-------------+----------------+
1 row in set (0.00 sec)

まとめ

基本構造はカラムやテーブルの指定+WHERE句。
これさえ抑えれば、問題無いと思います。

MySQL Table生成のコマンドを纏めます!

皆さんこんにちは
お元気ですか。私は元気かも。

うまいコーヒーは最高だ。

さて、今日はTableについて、特にテーブルについてまとめてみようと思います。

Table生成について

テーブル生成について

以下の例に基づいて考えてみましょう。

CREATE TABLE IF NOT EXIST user(
id INT NOT NULL AUTO_INCREMENT,
u_name TEXT,
address TEXT,
created timestamp NOT NULL default'0000-00-00 00:00:00',
updated timestamp NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
del_flg BOOLEAN,
PRIMARY KEY(id)
);

試しにこれを実行すると…?

Query OK, 0 rows affected (0.04 sec)

おっ、無事に作成されましたね。

もう一度実行すると…?

mysql> CREATE TABLE user
( id INT NOT NULL AUTO_INCREMENT, 
u_name TEXT, 
address TEXT,
created timestamp NOT NULL default'0000-00-00 00:00:00',
updated timestamp NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
del_flg BOOLEAN,
PRIMARY KEY(id) );

ERROR 1050 (42S01): Table 'user' already exists

アプリケーションを作成するとき、Tableがないときに実行してほしいケースがあります。

mysql> CREATE TABLE IF NOT EXISTS user(
id INT NOT NULL AUTO_INCREMENT,
u_name TEXT, 
address TEXT, 
created timestamp NOT NULL default'0000-00-00 00:00:00', 
updated timestamp NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
del_flg BOOLEAN, 
PRIMARY KEY(id) );
Query OK, 0 rows affected, 1 warning (0.00 sec)

IF NOT EXISTSを付け加えることで、達成することができます。

基本構文

テーブルのカラムについてですが、
<column名> <型> <Option> です。

例えば id名の場合、id名はINTでNOT NULL、AUTO_INCREMENTなOptionがついています。

型について

columnにも型があります

内容
INT 数値
CHAR 文字(文字が可変)
VARCHAR 文字(文字幅が固定長)
TEXT テキスト(可変長)
timestamp 時間
DATE 日付
TIME time
BOOLEAN Boolean値(True or Falth)

よく使うOption

AUTO_INCREMENT 自動で増加
NOT NULL NULLを許容しない

テーブル情報を見たい時

mysql> DESC user;                                                          
+---------+------------+------+-----+---------------------+-----------------------------+
| Field   | Type       | Null | Key | Default             | Extra                       |
+---------+------------+------+-----+---------------------+-----------------------------+
| id      | int(11)    | NO   | PRI | NULL                | auto_increment              |
| u_name  | text       | YES  |     | NULL                |                             |
| address | text       | YES  |     | NULL                |                             |
| created | timestamp  | NO   |     | 0000-00-00 00:00:00 |                             |
| updated | timestamp  | YES  |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
| del_flg | tinyint(1) | YES  |     | NULL                |                             |
+---------+------------+------+-----+---------------------+-----------------------------+
6 rows in set (0.01 sec)

CREATE文を出力

違う環境でCreateを行う時とかに使える内容となっております。

mysql> SHOW CREATE TABLE user;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                    |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `u_name` text,
  `address` text,
  `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `del_flg` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

テーブルを見たいとき

テーブルの一覧を確認しましょう。

mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)

削除

テーブルの削除をするときはこんな感じ。

mysql> Drop table user;
Query OK, 0 rows affected (0.03 sec)

感想

なんというか、こんなコマンドあったんだなぁとふと感じる今日でした。

MySQL Databaseの操作方法

皆さんこんにちは
お元気ですか?

今日はDatabaseを操作することについて試してみようと思います!

データベース

基本的に各アプリケーションで一つのデータベースを作ることが多いですね。
データベースを使ってから内部でテーブルを構成します。

データベース情報を確認する。

SHOW DATABASES;
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| homepage_master      |
| mysql                |
| performance_schema   |
| test                 |
+----------------------+

データベースを作る

mysql> CREATE DATABASE tests;
Query OK, 1 row affected (0.01 sec)

作成してから指定のデータベースを作る必要があります。

データベースを使う

mysql> USE tests;
Database changed

データベースを削除する

DROP DATABASE tests;
Query OK, 0 rows affected (0.01 sec)