1. TOP
  2. プログラム
  3. ソフト
  4. python
  5. リレーショナルデータベース

リレーショナルデータベース

リレーショナルデータベース

わずか、40年ほどの歴史しかまいが、広く普及している
●複数のユーザーによるデータへの同時アクセス
●ほかのユーザーの操作によるデータ破壊からの保護
●効率のよいデータの格納、参照
●スキマーによるデータ定義と制約によるデータへの制限
●異なるタイプのデータの間の関係を見つける結合
●宣言的なクエリー言語のSRL
これがリレーショナルと呼ばれているのは、表またはテーブル
という形式で、種類の異なるデータ間の関係を示すからだ。
テーブルは、行と列によるグリッド構造で、スプレッドシート
によく似ている。テーブルを作るには、名前を付け、列の順序、名前
タイプを指定する。各行は同じ列を持つが、列はデータなし(null)を
認めるかどうかを定義できる。
メニューの例では、掲載されている項目ごとに1行を与てテーブル
を作ることができる。各項目は、価格のための列を含め、同じ列を持つ。
通常、テーブルの中のある列、または列のグループが主キーになっており、
そのあたいはテーブル内で一意でなかればならない。これにより、テーブル
に同じデータを複数回追加することを防げる。
主キーは、クエリー中の高速参照のために、インデックス化される。
インデックスは本の索引と少し似ており、特定の行をすばやく見つけられよ
うにしてくれる。
個々のテーブルは、ファイルがディレクトリに含まれるように、親データ
ベースに含まれる
それぞれ、「データベースサーバ」、「データベース」、「データ」
と呼ぶ

SQL

APIやプロトコルではなく、宣言的な言語だ。何をしたいかを言うのでは
なく、どの様にしたいかと言う。
SQLクエリーは、クライアントがデータベースサーバーに送る文字列だ。
サーバーは、クエリーをどう処理するか判断する。
データベースベンダーが独自のひねりを入れた理、拡張を追加したため、
SQLには多くの方言がある。データをほかのタイプのデータベースに
移行するのは難しい場合がある

DDL(データ定義言語)
テーブルやデータベースの作成、削除、制約、許可などの処理
DML(データ操作言語)
データの挿入、選択、更新、削除などの処理

なぜ、全部大文字で書かれているのだろうか、SQLは大文字と小文字を区別
しないが、列名との区別のためコード例ではキーワードを大文字と言う
伝統になっている。
リレーショナルデータベースのDMLの主要な操作は、"CRUD"
C:Creat
INSERT文を使った作成
R:Read
SELECT文を使った読出し
U:Update
UPDATE文を使った更新
D:delete
DELETE文を使った削除

DB-API

なんらかのサービスにアクセスするために呼び出す関数を集めたもの
DP-APIはリレーショナルデータベースにアクセスするためのPythonの
標準APIである。
これを使えば、ひとつのプログラムで複数のリレーショナルデータベース
を操作できる。個々のデータベースのために別々にプログラムを書く
必要はない。JavaのJDBCやPerlのdbiのようなものだ。
DB-APIの主要な関数
connect()

cursor()

execute()とexecutemany()

fetchone(),fetchmany(),fetchall()

SQLite

軽くて優れたオープンソースのリレーショナルデータベースだ。
SQLiteはPythonの標準ライブラリとして実装され、通常のファイル
にデータベースを格納する。データベースを格納したファイルはマシン
、OSの違いを超えて使うことが出来る。そのため、単純なリレーシュナル
データベースのアプリケーションを作りたいときには、SQLiteは非常に
移植性が高くて公立的だ。MySQLやPostgreSQLのような本格的なものでは
ないが、SQLをサポートしており、複数のユーザーの同時アクセスに対応
出来る。ウエブブラウザ、スマートフォン、その他のアプリケーション
は、組み込みデータベースとして`SQLiteを使っている。
データベースを使ったりしたいときには、まずローカルなSQLiteデータ
ベースにconnect()する。このファイルは、テーブルを保持するデータ
ベースサーバーと同じような役割を果たす。特殊文字列の':memory'を
指定すると、メモリのみにデータベースを作る。高速でテスト用には
役に立つが、電源を切るとデータが失われる。
entrprise.dbという名前のデータベースを作り、繁盛している
道端のふれあい動物園ビジネスを管理するzooというテーブルを
作る。
テーブルの列
critter
動物の名前。主キー(可変長さ)
count
動物の現在の個体数(整数)
damages
動物とふれあいによる現在の損失額(整数)
import sqlite3
conn = sqlite3.connect('enterprise.db')
curs = conn.cursor()
curs.execute('''CREATE TABLE zoo(critter VARCHAR(20)
PRIMARY KEY, count INT, damages FLOAT)''')
SQLクエリーのような長い文字列を作るときは、Pythonのトリプルクオート
ば便利だ。
では、動物園に動物のデータを追加しよう。
curs.execute('INSERT INTO zoo VALUE("duck", 5, 0.0)')
curs.execute('INSERT INTO zoo VALUE("bear", 2, 1000.0)')
データの挿入には、プレースホルダーを使ったより安全な方法がある。
ins = 'INSERT INTO zoo(critter, count, damages) VALUES(?, ?, ?)'
curs.execute(inns, ('weasel', 1, 2000.0))
ここでは、SQLの中で3個の疑問符を使って3個の値を挿入する。
execute()関数への引数として3個の値のリストを渡している。
SQLインジェクションは、システムに悪意のあるSQLコマンド
curs.execute('SELECT * FROM zoo')
rows = curs.fetchall()
print(rows)
同じ情報を取り出すが、今度は個体数値にソートする。
curs.execute('SELECT * FROM zoo ODER BY count' )
順序は降順で
curs.execute('SELECT * FROM zoo ODER BY count DESC' )
もっとも損失の大きい動物は
curs.execute('''SELECT * FROM zoo WHERE
damages = (SELECT MAX(damages) FROM zoo)''' )

SQLliteから離れる前にはクリーンアップ処理が必要である
curs.close()
conn.close()