このサイトについて

みんなのPython Webアプリ編 - データベース概論

みんなのPython Webアプリ編 - データベース概論

データベース概論

Webアプリケーションでデータを保存するためによく利用されるのがデータベースです。データベースを使うと、大量のデータを保存したり、保存したデータを素早く取り出すことができます。

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

データベースにはいくつかの種類がありますが、中でもよく使われるのはリレーショナルデータベース(Relational Database)と呼ばれるデータベースです。リレーショナルデータベースでは、データを表のように見立てて登録、管理します。異なった種類の表のデータ間に関連性(Relation)を持たせることで、データ同士につながりを持たせ、複雑なデータを管理できるように設計されています。

たいていのデータベースは、独立したアプリケーションとして動きます。Webアプリのようなプログラムは、必要に応じてデータベースと通信を行います。通信を通して、データを保存したり、保存したデータを取り出したりするわけです。

図04 データベースとSQL

図04 データベースとSQL

データベースは、Webアプリだけでなくさまざまなアプリケーションやプログラムが利用します。データベースにデータを保存したり、データを取り出したりするためにはSQL(問い合わせ言語)と呼ばれる一種の言語を使います。SQLは言語ですので、Pythonと同じように文法があります。また、SQLには「標準」が定められています。多少の方言はあるものの、リレーショナルデータベースであればたいてい、標準的なSQLを利用することができます。

以下がSQLの簡単な例です。この例では、条件を設定してデータベースから情報を取り出しています。

SQLの簡単な例:

:::sql
SELECT id, title FROM rss WHERE date > '2005-10-23';

「WHERE」という文字列の後にあるのが日付の条件です。日付は、西暦などの要素をハイフンで区切った文字列として与えられていることから分かるとおり、データベースとのやりとりに使われるSQL自体も文字列です。データベースを利用するプログラムでは、SQLを文字列として組み立てて問い合わせをし、データを保存したり、保存したデータを取り出すわけです。

リレーショナルデータベースには、無料で利用できるオープンソースのデータベースから、製品となっているものまでさまざまな種類があります。Pythonのようなプログラムからデータベースを利用するためには、専用のモジュールが必要です。Pythonには、世の中にある主要なデータベースに接続するためのモジュールが多く揃っています。

Python 2.5からはSQLiteというデータベースに接続するためのモジュールが標準モジュールに内蔵されるようになりました。SQLiteは、データベース用のアプリケーションを使うことなく利用できる手軽なリレーショナルデータベースです。Python 2.5以上を使っていれば、Pythonを起動するだけでSQLiteを利用できるのです。本書では、このSQLiteを活用してWebアプリケーションを書きます。

ここからは、簡単にデータベースについて解説をしていきましょう。

テーブルとカラム

リレーショナルデータベースは表のような形式でデータを保存します。どのようなデータを保存するかによって、表の具体的な形式は変わります。リレーショナルデータベースでは、保存するデータの形式に合わせ、あらかじめ表の形式を定義しておきます。

この表の形式のことをテーブルと呼びます。区別するためにテーブルには名前を付けます。Pythonで新しい種類のデータ型を作りたいときにクラスを定義しますが、データベースのテーブルはそれに似ています。クラスにクラス名を付けるように、テーブルにはテーブル名を付けるわけです。

テーブルには保存したいデータにはどのような種類のデータが必要であるかを指定します。たとえば、住所を保存するテーブルを考えるとしましょう。

「東京都千代田区何々」というように1つの文字列として住所を保存することも可能ですが、分類のためにいくつかの部分に分けるようにする方がよいでしょう。「郵便番号」、「都道府県」、「市区町村以下」というように3つの部分に分けるとしましょう。それぞれのデータを保存するための領域が表に必要になります。

この領域をカラム(Column)と呼びます。カラムには「カラム名」を付けます。Pythonのクラスに例えると、データを保存するためのアトリビュートがカラムに相当します。

また、実際にデータを保存すると、表に行が追加されていきます。これを、データベースでは行(Row)と言います。データベースの行は、Pythonのクラスインスタンスのようなものと考えてください。

データベースでよく使われる用語の定義

データベースでよく使われる用語の定義

データベースでテーブルを定義するには、CREATE TABLEというSQL文を使います。以下のようなSQLを使ってテーブルを定義します。「CREATE TABLE」の後にある「address」というのはテーブル名です。

カラム名と、データの種類(データ型)を括弧で囲んで列記し、テーブルを定義します。idやprefectureという文字列がカラム名となります。

CREATE TABLE文の例:

:::sql
CREATE TABLE address (
    postcode text,
    prefecture text,
    address text );

カラムとデータ型

テーブル定義を行うSQL文では、カラムの名前に添えてデータ型を指定します。数値を保存したいときには数値型を指定します。同じ数値でも、整数を保存する場合と、小数点を含む実数を保存する場合では利用するデータ型が異なります。他にも、文字列を保存するためのデータ型、日付を保存するためのデータ型などが用意されています。

先ほどの例では、すべてのデータを文字列(text)として保存するようなテーブルを定義していました。

Pythonでもデータの性質によって利用するデータ型を変えますが、データベースでも同じことです。データベースの最大の特徴は、一度決めたデータ型は簡単に変更することができない、という点です。データベースによっては、あらかじめ定義したカラムのデータ型を変更できるものもありますが、その場合は保存されている列全体のデータ型を変換することになります。いずれにしても、カラムのデータ型はあらかじめしっかり決めておく必要がある、ということに変わりはありません。

IDとシリアル型

テーブル定義に利用するカラムとデータ型にはいくつか種類があります。中でも、よく利用されるカラムにidというものがあります。テーブルにたくさんの列が登録されているとき、特定の列を指定するために通し番号のようなものがあると便利です。idというカラムは、列につける通し番号としてよく使われます。idとは識別子(identifier)の頭文字を取ったものです。通し番号を指定すると、列が識別できる、というわけです。

idは通し番号ですので、データ型としては数値型を使えばよいことになります。新しい列が追加されたら、1つずつ増えてゆく番号、という特殊なデータ型としてシリアル(serial)型がよく利用されます。

先ほどの住所テーブルにシリアル型としてidというカラムを追加してみましょう。

idカラムを作成する例:

:::sql
CREATE TABLE address (
    id serial,
    postcode text,
    prefecture text,
    street text );

SQL:データベース用の問い合わせ言語

SQLとはデータベースとの通信を行うための手法です。SQLはPythonと同じ言語の一種です。SQLにも文法があります。文法に沿ってSQL文字列として組み立てて、データベースに指示を与えます。

これまで、データを保存するための定義テーブルを作るSQLについて簡単に解説しました。他にも、データを登録したり、登録したデータを特定の条件に従って取り出す機能を持っています。

ここでは、よく利用されるSQLについて簡単に解説をしましょう。

INSERT文(データの登録)

あらかじめ定義してあるテーブルにデータを登録するために使うのがINSERT文です。テーブルに対してデータの挿入(insert)を行います。INTOの後にテーブル名を指定します。その後、データの挿入を行うカラム名と、VALUESに続けて挿入するデータを記述します。Pythonと同じように、SQLでは文字列を二重引用符で囲みます。シリアル型のidのようなカラムは、データが自動的に挿入されるので、INSERT文で指定することはありません。

INSERT文の例:

:::sql
INSERT INTO address (postcode, prefecture, street)
    VALUES("100-0000", "東京都", "千代田区1-1");

データベースのテーブルをPythonのリストのリストだとすると、INSERT文はリストに対して要素を追加するappend()メソッドに似ています。

SELECT文(データの選択)

テーブルに登録されているデータを取り出すために利用するのがSELECT文です。SELECT文の後にデータを取り出すカラム名を指定します。その後、データを取り出すテーブル名を指定します。

SELECT文の例:

::sql
SELECT prefecture, street FROM address
    WHERE postcode="100-0000";

WHERE句以降ではデータを取り出す条件を指定します。ここでは、addressテーブルのpostcodeカラムを指定して、郵便番号で絞り込みを行っています。WHERE句には、ANDやORを使った複合条件を指定することもできます。WHERE句を指定しないと、すべてのデータを選択することになります。

WHERE句の他にも、取り出すデータの数を制限するLIMIT句や並び順を指定するORDERBY句などをあわせて利用することができます。 SELECT文はPythonのリストのリストから値を取り出すリスト内包表記に似た働きを持っていると言えます。

UPDATE文(データの更新)

テーブルに登録されているデータを更新するために利用するのがUPDATE文です。UPDATE文の後にテーブル名を指定し、SET句の後に更新をするカラム名と値をイコールでつなげて指定します。更新する値が複数ある場合はカンマで区切って列記します。

INSERT文の例:

:::python
UPDATE address SET postcode="001-0000", prefecture="北海道" WHERE id=10;

WHERE句はSELECT文でも出てきましたが、UPDATE文でも更新対象のデータを指定するために利用します。条件に該当するデータが複数あった場合には、複数の列が更新されます。この例では、idを指定して1つの列だけを更新しています。

DELETE文(データの削除)

登録済みのデータを削除するために利用するのがDELETE文です。SELECT文、UPDATE文と同じく、削除対象となるデータの条件をWHERE句で指定します。この例では、idを指定して1つのデータを削除しています。

DELETE文の例:

:::python
DELETE FROM address WHERE id=11;

WHERE句を指定しないこともできますが、その場合はテーブル上の全データを対象に削除を行うことになります。

2014-09-03 15:00