データベースへの書き込み
データベースへの書き込みは、データベース内のデータを操作することを意味します。書き込みにより、データベースの内容を変更できます。これは新しいデータの収集と保存、既存の情報の更新、または削除などを意味することがあります。これは、テストを通じてテスト対象のアプリケーションからデータを収集してさらなる分析のために使用する場合に有用です。
この操作が有用な一例は、ホテルを運営していて、ゲスト、部屋、ベッドに関する情報を含むデータベースを持ち、その情報を適切なサイズの部屋とゲス トを関連付けることで操作したい場合です。また、テスト対象のアプリケーションからデータを収集したり、Eggplant Functionalのテスト結果自体を収集して未来の分析のために保存するためにデータベースを使用する場合にも有用です(さらなる自動化テストを経由して可能性があります)。
レコード vs. プロパティリスト
レコード
は通常のプロパティリストとは異なります。これはデータベースへのアクティブな接続を持つプロパティリストの一種です(Property Lists参照)。データベースの行に対応するプロパティリストが取得されると、それはレコード
として知られています。レコードは可視のプロパティに加えて、それが取得されたデータベーステーブルに関する隠れた情報も含んでいます。
単純に言えば、レコードはデータベーステーブルの行に接続を持つプロパティリストです。レコードのプロパティの値を変更すると、データベースの対応する値が直接更新されます。レコードにはデータベーステーブルのカラムに対応しないプロパティが割り当てられる場合がありますが、データベースのカラムでないプロパティが割り当てられたり変更されたりした場合、その値はレコードオブジェクト内だけで変更され、データベースには影響しません。
例:
この例では、データベーステーブルのレコードにアクセスしてログに記録し、実際にレコードがどの ように見えるかを示します:
set myDB to {type:"odbc", DSN:"qaDB", user:"Ellen", password:"securePassword"} -- ODBCデータベース接続定義
put table "film" of myDB into myTable -- "film"データベーステーブルへの参照を変数myTableに格納
set Member to the record of myTable where title is "ACADEMY DINOSAUR" -- "film"テーブルの特定のレコードにアクセスして変数Memberに格納
Log Member -- Logs: {description:"A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies", film_id:"1", language_id:"1", last_update:"2017-06-28 15:47:10 -0700", length:"86", original_language_id:<missing value>, rating:"PG", release_year:"2006", rental_duration:"6", rental_rate:"3.99", replacement_cost:"20.99", special_features:"Deleted Scenes,Behind the Scenes", title:"ACADEMY DINOSAUR"}
テーブル間でのレコードのコピー
レコードが別の変数に割り当てられると、そのプロパティがすべてコピーされますが、コピーはデータベースへの接続を保持しません。これは、予期しない結果を避けるための設計です。データベースへの接続は、新しいコピーもレコードであるべきであることを示すas record
演算子を使用してコピーに保持することができます。
同じ効果は、元のレコードへの参照を作成することによって単一のレコードでも達成できますが、この手法はレコードのリストでは機能しません。as record
演算子の使用が推奨されます。
例:
set member to the record of memberTable where memberNumber is desiredMemNum -- メンバー変数はデータベースへの接続を持っています
put member into newMember -- newMemberはデータベースへの接続を持っていません
put member as record into member2 -- member2はデータベースへの接続を持っています
レコード演算子
is a record
演 算子は、値がデータベースへの接続を持つ実際のレコードか、単にプロパティリストかをテストするために使用できます。これは、データベース接続を使用するSenseTalkスクリプトのトラブルシューティングに役立ちます。
例:
Set myDB to {type:"Excel", file:"~/Desktop/ClubData.xlsx", Writable:yes} -- データベース接続を定義します。ExcelまたはODBCです。
put table "Members" of myDB into MemberTable-- 修正する必要のあるテーブルの参照情報を取得します
put {NameFirst:"Heidi", NameLast:"Mullers", StartDate:"2019-01-02"} into MemberToAdd -- これは、データベーステーブルに複数のメンバーを追加する場合に、反復子を使用して再帰的に行うこともできます
add record MemberToAdd to table "Members" of myDB -- データベースのテーブルにレコードを追加します
Put the Record of MemberTable where "NameFirst" is "Heidi" into member3-- ちょうど追加したレコードを取得して変数に格納します
if member3 is a record then log "Success!" -- レコードが実際のレコードで、アクティブなデータベース接続を持っていることを確認します
データベースレコード内の値の更新
データベーステーブル内の任意の値を更新するには、単にその行に対応するレコード内の値を変更し、データベース内のその値が自動的に更新されます。
レコード内の値が変更されると自動的にデータベースが更新されるこの機能は、デフォルトでオンになっており、手動更新を好む場合は無効にすることができます。詳しくは手動データベース更新をご覧ください。この機能は一部のデータベース(MSSQLなど)では機能しない場合があります。その場合は、手動更新を無効にしてください。
例:
Where
Expressionを使用してレコードを選択し、そのレコード内の値(expirationDate
)を修正する:
set memberTable to table "member" of myDB -- データベースにアクセスし、データのテーブルをmemberTableという名前の変数に格納します
set member to the record of memberTable where memberNumber is 3152134 -- 特定の値に基づいてレコードを選択するためのwhere節を使用します、この場合はmemberNumber
add 30 days to member's expirationDate -- これは、データベースのその特定のメンバーレコードの"expirationDate"列の値を更新します
例:
この例は、複数のレコードを反復処理するためのrepeat loopを使用して、メンバーの有効期限の日付をデータベーステーブルで変更する方法を示しています:
set memberExpirationDates to table "memberInfo" of myDB -- データベースにアクセスし、"memberInfo"テーブルのデータをmemberExpirationDatesという名前の変数に格納します
put [4260,1059,1685] into expirationstoUpdate -- 更新するメンバー番号のリストを変数に格納します
repeat with each Num in expirationstoUpdate -- リピートループを使用してメンバー番号のリストを反復処理します
set member to the record of memberExpirationDates where memberNumber is Num -- 特定のメンバー番号に対応するレコードを取得します
add 1 year to member's expirationDate -- そのメンバーの有効期限を1年延長します
end repeat
例:
この詳細な例は、色と明るさの変更をデータベーステーブルに更新する方法を示しています:
set palette to table "colorpalette" of myDB -- 変数'palette'をデータベーステーブル'colorpalette'を表すテーブルオブジェクトに設定します
set myColor to the record of palette where ID is 3 -- 変数'myColor'をデータベースの対応するレコードのレコードオブジェクトに設定します
put "black" into myColor's color -- データベースレコードを更新し、色の値を"black"に変更します
log MyColor -- ログ {brightness:"9", color:"black", ID:"3"}
set myColor to the record of palette where Color is "green" and brightness is "14"
add 10 to myColor's brightness -- データベースレコードを更新し、現在の明るさの値に10を追加します
log myColor -- ログ {brightness:"24", color:"green", ID:"4"}