1.4. ショートカット

DAL構文を理解する上で一番混乱するのが、ショートカットの存在です。ショットカットは使いこなせば便利ですが、機能やクラスの違いが理解できなければ混乱するばかりになります。

この章ではいろいろなタイプのショットカットを紹介します。

1.4.1. レコード挿入

標準的な構文とショットカットで表記できる構文を示します。括弧内に構文のクラスを表記します。

  1. 標準的な構文 ( Table

    >>> db.person.insert(name='Potamata')
    
  2. リスト形式でのレコード挿入( Table

    >>> db.person[0] = dict(name='Potamata')
    

    リスト形式でidを0で指定することにより、レコード挿入が可能です。idフィールドは自動採番します。

1.4.2. レコード検索

標準的な構文とショットカットで表記できる構文を示します。括弧内に構文のクラスと、出力されるオブジェクトのクラスを表記します。

  1. 標準的な構文 ( Set -> Rows

    >>> rows = db(db.person.id > 0).select()
    

    条件式を使った構文です。この構文は Set インスタンスになります。出力は Rows オブジェクトです。

  2. 条件式にTableインスタンスを指定 ( Set -> Rows

    >>> rows = db(db.person).select()
    

    条件式がTableインスタンスだと、web2pyは次の条件式に変換します。

    db.person.id > 0

  3. 条件式にFieldインスタンスを指定 ( Set -> Rows

    >>> rows = db(db.person.id).select()
    

    条件式がFieldインスタンスだと、web2pyは次のような条件式に変換します。

    db.person.id != None

  4. 条件式は設定せず、selectメソッド引数に指定 ( Set -> Rows

    >>> rows = db().select(db.person.name)  # personテーブルのnameフィールドだけを選択
    >>> rows = db().select(db.person.ALL)   # personテーブルの全フィールドを選択
    

    selectメソッドの引数には、FieldもしくはSQLALLインスタンスを指定します。選択するのは全レコードです。

  5. Tableインスタンスでidをリスト形式で指定することでレコードを取得することも可能です。( Table -> Row

    >>> row = db.person[4]                  # idフィールドが4のレコードを取得
    

    出力は Row インスタンスになります。

  6. Tableインスタンスを関数のように呼び出すことでレコードを取得することも可能です。( Table -> Row

    >>> row = db.person(4)                  # idフィールドが4のレコードを取得
    >>> row = db.person(db.person.id == 4)  # 条件式(Queryクラス)でレコードを取得
    >>> row = db.person(id=4)               # パラメータでフィールドと値を指定してレコードを取得
    >>> row = db.person(4, name='Pamasaso') # idとパラメータの2つの条件でレコードを取得
    

    出力は Row インスタンスのため、複数のレコードがあっても最初の一件だけになります。またリスト形式の5の方法より、6の方が比較的安全に使用できます。

1.4.3. レコード更新

標準的な構文とショットカットで表記できる構文を示します。括弧内に構文のクラスを表記します。

  1. 標準的な構文 ( Table

    >>> db(db.person.id == 1).update(name='Cotasata')
    
  2. リスト形式でのレコード更新( Table

    >>> db.person[1] = dict(name='Cotasata')
    

    リスト形式でid番号を指定することにより、レコード更新が可能です。

  3. Rowインスタンスからのレコード更新( Row

    >>> row = db.person(1)
    >>> row.update_record(name='Cotasata')
    

    Rowクラスでは、インスタンスの中に組み込み関数を自動設定しています。このためこの関数を呼び出せば、データベース上のレコード更新も可能です。

1.4.4. レコード削除

標準的な構文とショットカットで表記できる構文を示します。括弧内に構文のクラスを表記します。

  1. 標準的な構文 ( Table

    >>> db(db.person.id == 1).delete()
    
  2. リスト形式でのレコード削除( Table

    >>> del db.person[1]
    

    delとリスト形式でid番号を指定することにより、レコード削除が可能です。

  3. Rowインスタンスからのレコード削除( Row

    >>> row = db.person(1)
    >>> row.delete_record()
    

    Rowクラスでは、インスタンスの中に組み込み関数を自動設定しています。このためこの関数を呼び出せば、データベース上のレコード削除も可能です。