Web2py-database-abstraction-layer

提供:Dev Guides
移動先:案内検索

Web2py-データベース抽象化レイヤー

  • データベースアブストラクションレイヤー(DAL)*はweb2pyの主要な強みと考えられています。 DALは、基になるSQL構文に単純なアプリケーションプログラミングインターフェイス(API)を公開します。

この章では、タグで効率的に検索するクエリの構築や、階層的なカテゴリツリーの構築など、DALの重要なアプリケーションについて学びます。

DALの重要な機能は次のとおりです-

  • web2pyには、PythonオブジェクトをデータベースオブジェクトにマッピングするAPIであるDatabase Abstraction Layer(DAL)が含まれています。 データベースオブジェクトには、クエリ、テーブル、およびレコードを使用できます。
  • DALは、データベースバックエンドに指定された方言を使用して、リアルタイムでSQLを動的に生成するため、開発者が完全なSQLクエリを記述することは必須ではありません。
  • DALを使用する主な利点は、アプリケーションがさまざまな種類のデータベースと移植できることです。

DALの使用開始

web2pyのほとんどのアプリケーションはデータベース接続を必要とします。 したがって、データベースモデルの構築は、アプリケーション設計の最初のステップです。

“ helloWorld” *という名前の新しく作成されたアプリケーションを検討してください。 データベースは、アプリケーションのモデルの下に実装されます。 それぞれのアプリケーションのすべてのモデルは、- models/db_custom.py。*という名前のファイルに含まれています。

次の手順は、DALの実装に使用されます-

ステップ1-DALコンストラクター

データベース接続を確立します。 これは、DALコンストラクターとも呼ばれるDALオブジェクトを使用して作成されます。

db = DAL ('sqlite://storage.sqlite')

DALの注目すべき機能は、異なる種類のデータベースであっても、同じデータベースまたは異なるデータベースとの複数の接続を許可することです。 この行は既にファイル models/db.py にあることが確認されています。 したがって、削除するか、別のデータベースに接続する必要がない限り、必要ない場合があります。 デフォルトでは、web2pyは storage.sqlite ファイルに保存されているSQLiteデータベースに接続します。

このファイルは、アプリケーションのデータベースフォルダーにあります。 ファイルが存在しない場合、アプリケーションが最初に実行されたときにweb2pyによって作成されます。

SQLiteは高速で、すべてのデータを1つのファイルに保存します。 これは、あるアプリケーションから別のアプリケーションにデータを簡単に転送できることを意味します。 実際、SQLiteデータベースはweb2pyによってアプリケーションと一緒にパッケージ化されています。 翻訳、結合、集計などの完全なSQLサポートを提供します。

SQLiteには2つの欠点があります。

  • 1つは、列タイプを強制しないことであり、列の追加と削除を除いてALTER TABLEはありません。
  • 他の欠点は、書き込みアクセスを必要とするトランザクションによってデータベース全体がロックされることです。

ステップ2-テーブルコンストラクター

データベースとの接続が確立されると、 define_table メソッドを使用して新しいテーブルを定義できます。

たとえば-

db.define_table('invoice',Field('name'))

上記のメソッドは、テーブルコンストラクターでも使用されます。 テーブルコンストラクターの構文は同じです。 最初の引数はテーブル名であり、その後に* Field(s)*のリストが続きます。 フィールドコンストラクタは、次の引数を取ります-

Sr.No Arguments & Usage
1

The field name

テーブル内のフィールドの名前。

2

The field type

文字列(デフォルト)、テキスト、ブール、整数などのデータ型のいずれかを持つ値を取ります。

3

Length

最大長を定義します。

4

default = None

これは、新しいレコードが挿入されるときのデフォルト値です。

5

update = None

これはデフォルトと同様に機能しますが、値は更新時にのみ使用され、挿入時には使用されません。

6

Notnull

これは、フィールド値がNULLになるかどうかを指定します。

7

readable = True

これは、フィールドがフォームで読み取り可能かどうかを指定します。

8

writable = True

これは、フィールドがフォームで書き込み可能かどうかを指定します。

9

label = "Field Name"

これは、フォームのこのフィールドに使用されるラベルです。

*define_table* メソッドも3つの名前付き引数を取ります-

構文

db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
  • migrate = True -これはweb2pyにテーブルが存在しない場合は作成し、モデル定義と一致しない場合は変更するよう指示します。
  • fake_migrate = False -モデルがデータベーステーブルの内容と一致する場合、fake_migrate = Trueを設定すると、web2pyがデータを再構築するのに役立ちます。
  • format = '%(id)s' -これは、指定されたテーブルのレコードの表示方法を決定するフォーマット文字列です。

生SQLの生成

DALを使用すると、データベースへの接続を確立し、テーブルコンストラクターとフィールドコンストラクターを使用して新しいテーブルとそのフィールドを作成できます。

場合によっては、必要な出力に適合するようにSQLステートメントを生成する必要があります。 web2pyには、以下のように生のSQLを生成するのに役立つさまざまな機能が含まれています-

_インサート

特定のテーブルの挿入ステートメントをフェッチするのに役立ちます。 例えば、

print db.person._insert(name ='ABC')

「person」という名前のテーブルの挿入ステートメントを取得します。

SQLステートメントの出力-

INSERT INTO person(name) VALUES ('ABC');

_カウント

レコードの数を示すSQLステートメントのフェッチに役立ちます。 たとえば、「person」という名前のテーブルを考えてみましょう。「ABC」という名前の人の数を見つける必要があります。

print db(db.person.name ==' ABC ')._count()

SQLステートメントの出力-

SELECT count(*) FROM person WHERE person.name = ' ABC ';

_select

選択SQLステートメントの取得に役立ちます。 たとえば、「person」という名前のテーブルを考えてみましょう。「ABC」という名前の人物のリストを見つける必要があります。

print db(db.person.name == ' ABC ')._select()

SQLステートメントの出力-

SELECT person.name FROM person WHERE person.name = ' ABC ';

_delete

*delete SQL* ステートメントの取得に役立ちます。 たとえば、「person」という名前のテーブルについて検討し、「ABC」という名前のステートメントを削除する必要があるとします
print db(db.person.name == ' ABC ')._delete()

SQLステートメントの出力-

DELETE FROM person WHERE person.name = ' ABC ';4

_更新

更新されたSQLステートメントの取得に役立ちます。 たとえば、「person」という名前のテーブルを検討し、列名を他の値で更新する必要があります。

print db(db.person.name == ' ABC ')._update()

SQLステートメントの出力-

UPDATE person SET WHERE person.name = ’Alex’;

DALの問題(Gotchas)

SQLite

SQLiteには、列のドロップまたは変更のサポートがありません。 テーブルからフィールドを削除すると、データベース内でそのフィールドがアクティブのままになります。これにより、web2pyは加えられた変更を認識しなくなります。

この場合、 fake_migrate = True を設定する必要があります。これは、変更や削除などの変更がweb2pyの知識の下で保持されるように、メタデータを再定義するのに役立ちます。

SQLiteはブール型をサポートしていません。 このため、web2pyは内部的にブール値を1文字の文字列にマッピングし、「T」と「F」はそれぞれ trueFalse を表します。

MySQL

MySQLはALTER TABLE機能をサポートしていません。 したがって、データベースの移行には複数のコミットが含まれます。 この状況は、すべてのメタデータを保持するデータベースの定義中にパラメーター fake_migrate = True を設定することで回避できます。

オラクル

Oracleは、レコードのページネーション機能をサポートしていません。 また、キーワードOFFSETまたはlimitのサポートがありません。 このために、web2pyはDALの複雑な3ウェイネスト選択の助けを借りてページネーションを実現します。 Oracleデータベースが使用されている場合、DALはページネーションを単独で処理する必要があります。