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)