.. meta:: :keywords: web2py, framework, DAL, データベース抽象化レイヤ, 構文のテスト DAL構文のテスト =============== DALは複雑な動きをするため、実際に構文を試すのが理解への近道です。 インタラクティブ・シェル ------------------------ 簡単にDAL構文を試す方法として、web2pyをインタラクティブ・シェルで立ち上げる方法があります。これは次のオプションをつけて、web2pyを起動します。 *-S アプリケーション名* web2pyの環境が、インタラクティブ・シェルもしくはIPythonで起動します。しかしアプリケーションサーバー環境は起動しないため、ブラウザでのアクセスはできません。 この他に次のオプションもあります。 *-M* アプリケーションのモデル定義をインポートします。モデルで記述した環境が、シェルで利用できます。 *-P* インタラクティブ・シェルではなく、通常のシェルを起動します。 それでは実際に試してみましょう。コマンドプロンプトから、次のように起動します。 :: python web2py.py -S myapp -M アプリケーション名は myappです。web2pyをIPythonシェルで起動します。 .. image:: ../../images/web2py_dal/web2py_dal_006r.JPG 通常のシェル環境での起動も試してみます。 :: python web2py.py -S myapp -M -P .. image:: ../../images/web2py_dal/web2py_dal_007r.JPG シェルで利用できる便利なコマンド -------------------------------- * typeコマンド DAL構文を試す時に便利なのが、typeコマンドです。変数の型を表示してくれます。 IPythonでのサンプル :: In [1]: type db.person ------> type(db.person) Out[1]: 通常シェルでのサンプル :: >>> type(db.person.name) 通常シェルではtypeコマンド発行時に、対象を括弧で囲む必要があります。 * 接続文字列やデータベース名の取り出し 接続文字列やデータベース名の取り出しも可能です。 属性値として :attr:`~dal.DAL._uri` や :attr:`~dal.DAL._dbname` などがあります。 まずデータベースに接続します。 :: >>> db = DAL('sqlite://storage.db') 接続文字列を取り出します。 :: >>> db._uri sqlite://storage.db データベース名を取り出します。 :: >>> db._dbname sqlite * テーブルやフィールドの取り出し データベースに問い合わせて、テーブルやフィールド名一覧を取り出すことが可能です。 メソッドの :meth:`~dal.DAL.tables` と :meth:`~dal.Table.fields` を使用します。 アプリケーションに含まれるテーブル一覧を取り出します。 :: >>> db.tables ['auth_user', 'auth_group', 'auth_membership', 'auth_permission', 'auth_event', 'auth_cas', 'numbers', 'person', 'dog', 'feed', 'cat', 'inventory', 'mouse'] テーブルのフィールドを取り出します。 :: >>> db.person.fields ['id', 'name'] テーブル一覧を利用して、次のようにアプリケーションに含まれるテーブルを削除することも可能です。 :: >>> while len(db.tables): ... for t in db.tables: ... exec 'db.%s.drop()' % t ... >>> db.tables [] whileとfor文で二重に回している理由は、何らかの依存関係で上手く削除できないテーブルがあるからです。 シェルでのトランザクション制御 ------------------------------ web2pyのトランザクション制御は通常、適切なコードが挿入され自動で実行されます。しかしシェル上では、自動でコード挿入は行われません。このため必要に応じて、コミットとロールバック命令を発行する必要があります。 命令発行は次のように行います。 コミット :: >>> db.commit() ロールバック :: >>> db.rollback()