メインコンテンツまでスキップ

変化と追加情報

以下のトピックは、データベースと共にSenseTalkを使用する際に有用な、さまざまなアプローチと追加情報を提供します。

コネクションの開放と閉鎖

SenseTalkは、コネクション情報が提供され、table expressionやデータベースからの情報が必要な他の表現が使用されると、自動的にコネクションを確立します。コネクションは、データベースからのテーブル情報やレコードデータが変数に入力されていない場合に閉じます。

しかし、データベースの接続を明示的に開いたり閉じたりすることも可能です。これは、open databaseclose databaseのコマンドを使用して行います。

Open Database/ Close Database コマンド

動作: 明示的に指定したデータベース接続を開いたり閉じたりします。

通常、データベース接続はそれを参照する変数が使用中である限り開いたままになりますので、接続は通常、それらを作成するハンドラの終了時に閉じられ、あるいはそれよりも早く閉じられることがあります。 open connectionコマンドを使用して明示的に接続を開くと、他のスクリプトやハンドラへの呼び出し中も含めて、close connectionコマンドを使用して明示的に閉じられるまで開いたままになります。このアプローチは、データベースへの個別の接続の数を制限することが重要な場合、またはそのデータベースへの接続を確立することが特に時間のかかるプロセスである場合、効率性の観点から望ましいかもしれません。

パラメータ: データベース接続に必要なすべての情報を含むプロパティリスト。詳細については、データベース接続を参照。

例: ODBC

以下は、ODBCデータベース接続を開いて再度閉じる例です:

set myDB to {type:"odbc", DSN:"DataSource1", user:"root", password:""}
open database myDB
// Execute any database operations here
close database myDB

例: Excel

以下は、Excelデータベース接続を開いて再度閉じる例です:

set myExcelDB to {type: "excel", file: ResourcePath("MyCustomers.xlsx")}
open database myExcelDB
// Execute any database operations here
close database myExcelDB

データベース識別子

データベース接続が開かれると(open databaseコマンドにより明示的に、または必要に応じて自動的に)、それには一意の識別子が割り当てられます。

databaseIdentifier()関数

動作: 指定したデータベースに関連付けられた一意の識別子を返します。

パラメータ: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、データベース接続を参照。

例:

set myDB to {type:"odbc", DSN:"mySQLDB", user:"root", password:decodetext("AR@ts:%j")} -- Define a database conection
put the databaseIdentifier of myDB -- Returns empty if myDB isn't open

openDatabases()関数

振る舞い: 現在開いているすべてのデータベース接続の識別子のリストを返します。

パラメータ: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、データベース接続を参照してください。

例:

put the openDatabases

SQLを直接実行する

SQLデータベースに慣れているユーザーのために、任意のSQL文を直接実行するexecuteSQL()関数が利用可能です。これは、選択文または他の情報を返す文のプロパティリストのリストを返します。情報を返さない操作を行うSQL文は、空のリストを返します。エラーは例外をスローします。

ノート

テーブルから1行以上を返すSQL select文の場合、executeSQL()関数はSenseTalk record オブジェクトを 返さないことに注意してください。この場合、返される値はデータベースとは無関係の普通のプロパティリストです。詳細については、Records vs. Property Listsを参照してください。

executeSQL 関数

値: executeSQL()関数には、データベース接続と実行するSQL文の2つの値を渡す必要があります。

振る舞い: 指定したSQL文を直接実行し、プロパティリストを返します。

例:

この例では、データベース接続を定義し、そのデータベースに対してexecuteSQL()関数を使ってSQLを直接実行します。

set myDB to {type:"odbc", DSN:"DataSource1", user:"root", password:""} -- Defines the database connection.
put executeSQL(myDB, "select * from Members") into listOfRowInformation -- Executes an SQL select statement against the defined database connection.

例:

この例では、データベースを定義し、executeSQL()関数を使ってそのデータベースに対してSQLを実行します。ここではSQLのwhere句を使っています(これは機能的にはSenseTalkのwhere expressionと同じです)。

set myDB to {type:"odbc", DSN:"qaDB", user:"testplant", password:"eggplant"} -- Database connection definition
put executeSQL(myDB, "select* from Members where language_id='1'") into listOfRowInformation -- Executes an SQL select statement against the database that selects all of the records for the table called "Members" where the column "language_id" contains a value of 1, and stores that information in the listofRowInformation variable.

自動対手動データベースの更新

データベースの更新はデフォルトで自動的に保存されます。しかし、autoSaveDatabaseUpdates グローバルプロパティを使用すると、この設定を変更してデータベースの更新を手動にすることができます。

AutoSaveDatabaseUpdates グローバルプロパティ

値: Boolean.

デフォルト: True.

振る舞い: すべてのデータベーステーブルの更新の扱いを制御します。自動データベース更新をオフにするには、autoSaveDatabaseUpdates グローバルプロパティを false に設定します。

ノート

個々のテーブルの自動保存動作を制御するには、テーブルオブジェクトの autoSaveUpdates property を設定します。自動保存を無効にした後、レコード値のすべての変更はローカルに記録されます。その後、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"}]'

レコードの更新をデータベースに書き込む際にエラーが発生した場合(save changesコマンドの結果または自動保存から)、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>) 関数

振る舞い: 指定したデータベースサーバーに関するバージョン情報を返します。

パラメータ: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、Database Connectionsを参照してください。

schemaNames(<database>) 関数

振る舞い: 接続を通じて利用可能なすべてのデータベーススキーマ(データベースと呼ばれることもある)の名前を返します。一部のデータベースアダプタはこの機能をサポートしていない場合があります。

パラメータ: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、Database Connectionsを参照してください。

tableNames(<database>) 関数

振る舞い: データベース内のすべてのテーブルの名前のリストを返します。テーブル名はtable expressionsを使用する際に必要です。

パラメータ: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、Database Connectionsを参照してください。

recordInfo(<table>) 関数

振る舞い: テーブルのすべての列と関連情報についての情報を返します。

パラメータ: データベース参照(接続を定義する完全なプロパティリスト)。詳細については、Database Connectionsを参照してください。