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オブジェクトを使用して作成されます。
DALの注目すべき機能は、異なる種類のデータベースであっても、同じデータベースまたは異なるデータベースとの複数の接続を許可することです。 この行は既にファイル models/db.py にあることが確認されています。 したがって、削除するか、別のデータベースに接続する必要がない限り、必要ない場合があります。 デフォルトでは、web2pyは storage.sqlite ファイルに保存されているSQLiteデータベースに接続します。
このファイルは、アプリケーションのデータベースフォルダーにあります。 ファイルが存在しない場合、アプリケーションが最初に実行されたときにweb2pyによって作成されます。
SQLiteは高速で、すべてのデータを1つのファイルに保存します。 これは、あるアプリケーションから別のアプリケーションにデータを簡単に転送できることを意味します。 実際、SQLiteデータベースはweb2pyによってアプリケーションと一緒にパッケージ化されています。 翻訳、結合、集計などの完全なSQLサポートを提供します。
SQLiteには2つの欠点があります。
- 1つは、列タイプを強制しないことであり、列の追加と削除を除いてALTER TABLEはありません。
- 他の欠点は、書き込みアクセスを必要とするトランザクションによってデータベース全体がロックされることです。
ステップ2-テーブルコンストラクター
データベースとの接続が確立されると、 define_table メソッドを使用して新しいテーブルを定義できます。
たとえば-
上記のメソッドは、テーブルコンストラクターでも使用されます。 テーブルコンストラクターの構文は同じです。 最初の引数はテーブル名であり、その後に* 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" これは、フォームのこのフィールドに使用されるラベルです。 |
構文
- migrate = True -これはweb2pyにテーブルが存在しない場合は作成し、モデル定義と一致しない場合は変更するよう指示します。
- fake_migrate = False -モデルがデータベーステーブルの内容と一致する場合、fake_migrate = Trueを設定すると、web2pyがデータを再構築するのに役立ちます。
- format = '%(id)s' -これは、指定されたテーブルのレコードの表示方法を決定するフォーマット文字列です。
生SQLの生成
DALを使用すると、データベースへの接続を確立し、テーブルコンストラクターとフィールドコンストラクターを使用して新しいテーブルとそのフィールドを作成できます。
場合によっては、必要な出力に適合するようにSQLステートメントを生成する必要があります。 web2pyには、以下のように生のSQLを生成するのに役立つさまざまな機能が含まれています-
_インサート
特定のテーブルの挿入ステートメントをフェッチするのに役立ちます。 例えば、
「person」という名前のテーブルの挿入ステートメントを取得します。
SQLステートメントの出力-
_カウント
レコードの数を示すSQLステートメントのフェッチに役立ちます。 たとえば、「person」という名前のテーブルを考えてみましょう。「ABC」という名前の人の数を見つける必要があります。
SQLステートメントの出力-
_select
選択SQLステートメントの取得に役立ちます。 たとえば、「person」という名前のテーブルを考えてみましょう。「ABC」という名前の人物のリストを見つける必要があります。
SQLステートメントの出力-
_delete
SQLステートメントの出力-
_更新
更新されたSQLステートメントの取得に役立ちます。 たとえば、「person」という名前のテーブルを検討し、列名を他の値で更新する必要があります。
SQLステートメントの出力-
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はページネーションを単独で処理する必要があります。