変化と追加情報
以下のトピックは、データベースと共にSenseTalkを使用する際に有用な、さまざまなアプローチと追加情報を提供します。
コネクションの開 放と閉鎖
SenseTalkは、コネクション情報が提供され、table expressionやデータベースからの情報が必要な他の表現が使用されると、自動的にコネクションを確立します。コネクションは、データベースからのテーブル情報やレコードデータが変数に入力されていない場合に閉じます。
しかし、データベースの接続を明示的に開いたり閉じたりすることも可能です。これは、open databaseとclose databaseのコマンドを使用して行います。
Open Database/ Close Database Commands
Behavior: 明示的に指定したデータベース接続を開いたり閉じたりします。
通常、データベース接続はそれを参照する変数が使用中である限り開いたままになりますので、接続は通常、それらを作成するハンドラの終了時に閉じられ、あるいはそれよりも早く閉じられることがあります。 open connectionコマンドを使用して明示的に接続を開くと、他のスクリプトやハンドラへの呼び出し中も含めて、close connectionコマンドを使用して明示的に閉じられるまで開いたままになります。このアプローチは、データベースへの個別の接続の数を制限することが重要な場合、またはそのデータベースへの接続を確立することが特に時間のかかるプロセスである場合、効率性の観点から 望ましいかもしれません。
Parameters: データベース接続に必要なすべての情報を含むプロパティリスト。詳細については、データベース接続を参照。
例: ODBC
以下は、ODBCデータベース接続を開いて再度閉じる例です:
set myDB to {type:"odbc", DSN:"DataSource1", user:"root", password:""}
open database myDB
// ここでデータベース操作を実行します
close database myDB
例: Excel
以下は、Excelデータベース接続を開いて再度閉じる例です:
set myExcelDB to {type: "excel", file: ResourcePath("MyCustomers.xlsx")}
set myExcelDB to {type: "excel", file: ResourcePath("MyCustomers.xlsx")}
open database myExcelDB
// ここでデータベース操作を実行します
close database myExcelDB
データベース識別子
データベース接続が開かれると(open databaseコマンドにより明示的に、または必要に応じて自動的に)、それには一意の識別子が割り当てられます。
databaseIdentifier()関数
Behavior: 指定したデータベースに関連付けられた一意の識別子を返します。
Parameters: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、データベース接続を参照。
例:
set myDB to {type:"odbc", DSN:"mySQLDB", user:"root", password:decodetext("AR@ts:%j")} -- データベース接続を定義する
put the databaseIdentifier of myDB -- Returns empty if myDB isn't open
openDatabases()関数
Behavior: 現在開いているすべてのデータベース接続の識別子のリストを返します。
Parameters: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、データベース接続を参照。
例:
put the openDatabases
SQLを直接実行する
SQLデータベースに慣れているユーザーのために、任意のSQL文を直接実行するexecuteSQL()関数が利用可能です。これは、選択文または他の情報を返す文のプロパティリストのリストを返します。情報を返さない操作を行うSQL文は、空のリストを返します。エラーは例外をスローします。
テーブルから1行以上を返すSQL select文の場合、executeSQL()関数はSenseTalk record オブジェクトを 返さないことに注意してください。この場合、返される値はデータベースとは無関係の普通のプロパティリストです。詳細については、Records vs. Property Listsを参照してください。
executeSQL 関数
Values: executeSQL()関数には、データベース接続と実行するSQL文の2つの値を渡す必要があります。
Behavior: 指定したSQL文を直接実行し、プロパティリストを返します。
例:
この例では、データベース接続を定義し、そのデータベースに対してexecuteSQL()関数を使ってSQLを直接実行します。
set myDB to {type:"odbc", DSN:"DataSource1", user:"root", password:""} -- データベース接続を定義します。
put executeSQL(myDB, "select * from Members") into listOfRowInformation -- 定義されたデータベース接続に対して SQL 選択ステートメントを実行します。
例:
この例では、データベースを定義し、executeSQL()関数を使ってそのデータベースに対してSQLを実行します。ここではSQLのwhere句を使っています(これは機能的にはSenseTalkのwhere expressionと同じです)。
set myDB to {type:"odbc", DSN:"qaDB", user:"testplant", password:"eggplant"} -- データベース接続の定義
put executeSQL(myDB, "select* from Members where language_id='1'") into listOfRowInformation -- データベースに対して SQL 選択ステートメントを実行し、"Members" というテーブルのすべてのレコードを選択します。このレコードは列 "language_id" に値 1 が含まれており、その情報が listofRowInformation 変数に格納されます。
自動対手動データベースの更新
データベースの更新はデフォルトで自動的に保存されます。しかし、autoSaveDatabaseUpdates グローバルプロパティを使用すると、この設定を変更してデータベースの更新を手動にすることができます。
AutoSaveDatabaseUpdates グローバルプロパティ
Value: Boolean.
Default: True.
Behavior: すべてのデータベーステーブルの更新処理方法を制御します。データベースの自動更新を無効にするには、グローバルプロパティ「autoSaveDatabaseUpdates」を「false」に設定します。
個々のテーブルの自動保存動作を制御するには、テーブルオブジェクトのautoSaveUpdatesプロパティを設定します。自動保存を無効にすると、レコードの値へのすべての変更がローカルに記録されます。その後、save changesコマンドを使用して、これらの変更をデータベースに書き込むことができます。
例
set the autoSaveDatabaseUpdates to false -- 自動更新をオフにする
set info to table "memberinfo" of myDB
set member to the record of info where memberNumber is 16
Add 60 days to member's expirationDate
put "23" into member's memberNumber
put the records of info -- 出力: '[{expirationdate:"2020-04-13", membernumber:"16"},{expirationdate:"2019-12-30", membernumber:"18"}]'
save all changes to info -- すべての保留中の更新をテーブルに送信
put the records of info -- 出力: '[{expirationdate:"2019-12-30", membernumber:"18"},{expirationdate:"2020-06-12", membernumber:"23"}]'
自動保存が無効になっている場合、recordsToUpdate() 関数を使用して、未保存の更新があるテーブルから取得されたレコードのリストを取得できます。これらのレコードは、save changes コマンドを使用した際に保存されます。次の例は、自動保存を無効にし、save changes コマンドを使用した際に保存されるレコードをログに記録する方法を示しています。
例:
set myDB to {type: "odbc", DSN: "mySQLDB", user: "root", password: decodetext("AR@ts:%j")}
set the autoSaveDatabaseUpdates to false
set palette to table "colorpalette" of myDB
set myColor to the record of palette where color is "purple"
put "45" into myColor's brightness
log recordsToUpdate(palette) -- ログ: '[{brightness:"45", color:"purple", ID:"3"}]'
データベースへのレコード更新の書き込み時にエラーが発生した場合(変更内容保存コマンドの結果、または自動保存の結果)、SenseTalkは例外をスローします。この例外をキャッチするためのtry/catchブロックが有効になっている場合は 、テーブルに対してfailedUpdateRecords()関数とfailedUpdateExceptions()関数を呼び出すことで、更新に失敗した変更を含むレコードのリストと、それらのレコードで発生した例外をそれぞれ取得できます。
例:
try
set info to table "memberinfo" of myDB
set member to the record of info where memberNumber is 18
put "05/25/2018" into member's expirationDate
catch
put failedUpdateRecords(info) -- 出力: '[{expirationdate:"05/25/2018", membernumber:"18"}]'
put failedUpdateExceptions(info) -- 出力: '(ST_ODBC_ResultError: [MySQL][ODBC 5.3(a) Driver][mysqld-5.7.11-log]Incorrect date value: '05/25/2018' for column 'expirationdate' at row 1, SQLSTATE=HY000)'
end try
データベース情報関数
以下の関数は、データベース、テーブル、利用可能なデータベースタイプについての追加情報を取得するために使用できます。
databaseVersion(<database>) 関数
Behavior: 指定したデータベースサーバーに関するバージョン情報を返します。
Parameters: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、データベース接続を参照。
schemaNames(<database>) 関数
Behavior: 接続を通じて利用可能なすべてのデータベーススキーマ(データベースと呼ばれることもある)の名前を返します 。一部のデータベースアダプタはこの機能をサポートしていない場合があります。
Parameters: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、Database Connectionsを参照してください。
tableNames(<database>) 関数
Behavior: データベース内のすべてのテーブルの名前のリストを返します。テーブル名はtable expressionsを使用する際に必要です。
Parameters: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、Database Connectionsを参照してください。
recordInfo(<table>) 関数
Behavior: テーブルのすべての列と関連情報についての情報を返します。
Parameters: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、Database Connectionsを参照してください。