Web2py-database-abstraction-layer
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」はそれぞれ true と False を表します。
MySQL
MySQLはALTER TABLE機能をサポートしていません。 したがって、データベースの移行には複数のコミットが含まれます。 この状況は、すべてのメタデータを保持するデータベースの定義中にパラメーター fake_migrate = True を設定することで回避できます。
オラクル
Oracleは、レコードのページネーション機能をサポートしていません。 また、キーワードOFFSETまたはlimitのサポートがありません。 このために、web2pyはDALの複雑な3ウェイネスト選択の助けを借りてページネーションを実現します。 Oracleデータベースが使用されている場合、DALはページネーションを単独で処理する必要があります。