データベースへの書き込み
データベースへの書き込みは、データベース内のデータを操作することを意味します。書き込みにより、データベースの内容を変更できます。これは新しいデータの収集と保存、既存の情報の更新、または削除などを意味することがあります。これは、テストを通じてテスト対象のアプリケーションからデータを収集してさらなる分析のために使用する場合に有用です。
この操作が有用な一例は、ホテルを運営していて、ゲスト、部屋、ベッドに関する情報を含むデータベースを持ち、その情報を適切なサイズの部屋とゲストを関連付けることで操作したい場合です。また、テスト対象のアプリケーションからデータを収集したり、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"}
データベーステーブルに新しいレコードを追加する
データベーステーブルにレコードを追加するには、まず、テーブルの列と一致するプロパティを含む1つ以上のプロパティリストを作成します。そして、add record
またはadd records
コマンドを使用して、それらのレコードをテーブルに追加します。
Add Record/ Add Records Command
動作: 指定されたレコードをデータベースの指定されたテーブルに追加します。複数のレコードを追加するためには、Add Records
バリエーションを使用します。
パラメータ: データベースにレコードとして追加されるプロパティリスト
と、そのレコードが追加されるデータベース内のテーブル名
。
例:
set myTable to table "Members" of myDB -- スクリプト内の変数、myTableにMembersテーブルを読み込みます
set newMember to {firstName:"Fritz", lastName:"Geisler", memberNumber:4307}
add record newMember to myTable -- newMemberは必要なすべての値を持つ必要があります。myTableはmyDBデータベースのMembersテーブルを参照します。
例:
以下の例では、the result
を使用してEggplant Functionalテスト結果の詳細を取得し、Add Record
コマンドを使用してデータベースに保存します。以下で使用されているコマンドと関数の詳細については、RunWithNewResults
とthe result
を参照してください。
//以下のコードはRunWithNewResultsの結果をデータベーステーブルに書き込みます
set myDB to {type:"odbc", DSN:"mySQLDB", user:"carrie", password:"password123"}
RunWithNewResults "CreateWorkspaceTestCase"
put the result into myResult -- 結果のプロパティリストを変数に格納して、後でその異なるプロパティを参照できるようにします
set newResult to {ExecutionTime:myResult.RunDate, TestName:"CreateWorkspaceTestCase", Result:myResult.status} -- "the result"に基づいて新しいレコードを作成します。ExecutionTime、TestName、Resultはデータベーステーブルの列名です。
Add record newResult to table "results" of myDB -- 新しいレコードをテーブルに追加します
Add Records Variation
add records
コマンドを使用して、一つのコマンドでテーブルに多数のレコードを追加することができます。
データベーステーブルにはさまざまなルールが関連付けられている場合があります。たとえば、一部の列は任意であり、他の列はすべてのレコードで値が割り当てられる必要がある場合があります。また、memberNumber
のような列は、テーブルの各レコードが異なるmemberNumber
値を持つ必要があるunique
である必要があります。これらのルールのいずれかに違反してデータベースにレコードを追加しようとすると、それは拒否され、スクリプトで例外がスローされます。
データベーステーブルからのレコードの削除
レコードは、Delete Record
コマンド(複数形も可能、つまりDelete Records
)を使用して削除できます。このコマンドは、Where
式を使用して削除するレコードの特性を指定するために変更することができます。
Delete Record/ Delete Records コマンド
振る舞い: このコマンドは、データベーステーブルから前に取得したレコードを削除します。
パラメータ: 削除する 前に取得したレコードまたはレコードを含む変数の名前。
例:
delete record
コマンドは、データベーステーブルから前に取得したレコードを削除するために使用されます。
put the records of table "colorpalette" of myDB where ID is 2 into colortoDelete
delete record colortoDelete
Where式を使用してレコードを指定する
Where式は、record
またはrecords
関数、レコードの数関数、またはdelete records
コマンドを使用してテーブルから希望のレコードを選択するために使用できます。
例:
この例では、where
節を使用して削除する必要があるレコードを指定し、その後でdelete records
コマンドを使用してそれらのレコードを削除します。
put table "colorpalette" of myDB into myColors
delete records from myColors where brightness is greater than 10
例:
この例では、Where
を使用してデータベースから複数のレコードを読み取り、その後でdelete records
コマンドを使用してそれらのレコードを削除します。
put the records of myTable where state is "Colorado" into doomedRecords
delete records doomedRecords
自動 vs. 手動更新
データベースの更新はデフォルトで自動的に保存されます。しかし、the autoSaveDatabaseUpdates
グローバルプロパティを使用することで、データベースの更新が手動になるようにこの設定を変更する能力を持っています。詳細は Automatic vs Manual Updates をご覧ください。