2010-03-31

『売上猫くん on MySQL』開発日記 - 番外8 - insert...select構文とODBC

以下、ODBC 5.1.5だと×、5.1.6だとOK

INSERT INTO estimates(customerNo) SELECT customerNo FROM estimates WHERE ID=5

これ、痛い。 この構文使えずに困っている人、結構いるんじゃなかろうか? 回避方法も見つからないし。


参考サイト:Bug #42905


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-29

『売上猫くん on MySQL』開発日記 - 番外7 - FileMaker内にMySQLの一般ログを表示する

MySQL の一般ログをFileMakerで表示する方法。

1.MySQLのMySQLデータベースをDSN登録する。
2.my.ini に log-output=TABLE,FILE を指定。
3.以下をMySQLコマンドラインで実行。
mysql> SET @old_log_state = @@global.slow_query_log;
mysql> SET GLOBAL general_log = 'OFF';
mysql> ALTER TABLE mysql.general_log ENGINE = MyISAM;
mysql>ALTER TABLE `mysql`.`general_log` ADD COLUMN `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`id`);
mysql> SET GLOBAL general_log = @old_log_state;
4.MySQL を再起動。
5.FileMaker のリレーションシップで、上記1で作成したDSNのmysql.general_logテーブル選択。このとき、上記で作成した id を指定。(以下、略)

するとこんな感じでログを表示できる。


FMの自動発行SQLクエリで「?」が頭に点灯したら、ログをチェックするのがよろしいかと。

尚、FM標準コマンドでは general_log テーブルのログは削除できないので、truncate(テーブル内の全行削除) を使用する。以下はFMの「SQLを実行」ステップを使用して、truncate を実行。

参考サイト:一般クエリとスロー クエリのログ出力先の選択

2010/9/24 追記
ログが出力されない場合、mysqlコマンドで
SET GLOBAL general_log = 'ON';
を実行してみる。

2010/10/25 追記
id の属性に AUTO_INCREMENT を追加。

2010/10/15 追記
slow_query についても、上記の要領でFileMaker上に表示可能だが、ログ対象となるクエリ時間の閾値がデフォルトでは10(秒)になっている。この為、ログ書き込みされないと思いこんでしまう。このデフォ値は、my.ini で long_query_time = 1 とするか、set global long_query_time = 1 を実行することにより変更できる。



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-27

『売上猫くん on MySQL』開発日記 - 2 - 開発環境

『売上猫くん on MySQL』の開発環境は以下の通り。


アプリケーションファイル(NekoApp.fp7)は、FileMaker Server Advanced 10(以下、FMServerAdv)上に置き、開発PC1、2、3及び開発Mac 10.6 の FileMaker Pro Advanced 10(以下、FMPA)からそのファイルにアクセスして開発を行う。FMServerAdv を使用する理由には、複数人が開発を安定して行えること、オンラインバックアップがスケジュールできる、という2点が挙げられる。 
サーバ側にODBCをインストールしておけば、クライアント(開発PC)にはODBCは不要である(例外は後述)。
アプリケーション/ODBCの配布・アップグレードの容易さを考えれば、この構成は運用においても一考の価値はあると思う。 
なお、図の「開発PC3 Win2008/TS」は Terminal Service を載せたWindows Server 2008機で、各クライアントがリモートデスクトップ接続によりFMPAを起動し、FMServerAdv にアクセスできるようにしている。(もともと、FileMaker は Terminal Service との相性が良く、Ver5位より常用しているが、近年のTerminal Service はローカルプリンタへの印刷、ローカルディスクの利用も格段に簡単にできるようになり、加えて接続遮断時にも接続を自動で復旧してくれたりする)。

前述のように FMSA (FileMaker Server無印も同様)にODBCをインストールすればクライアントにODBCを入れる必要はないが、例外がある。それは「SQLを実行」スクリプトステップを使用する場合である。 FileMaker は通常、開発者自らSQLを記述する必要はないが、FileMaker が用意していないコマンドを実行する場合は「SQLを実行」を使用する。また、FileMaker の外部DBに対する処理の中には非常に遅いものがあり(激遅処理)、その典型的なものに多数のレコードに及ぶ一括処理がある。CSV等のファイル取込、全置換、ループ等がそれである。 その回避策として 「SQLを実行」スクリプトステップにSQL文を埋め込み実行すると直接外部データベースに素のSQLが送られるので、FileMakerのレコード取込やループ処理を使うのに比べれて、桁違いにパフォーマンスが向上する。尚、FileMaker の外部DB使用時の激遅処理については、機会を改めて書きたい。

さて、開発PC1、ここには予備用のMySQLを入れ、リストアやリカバリをテストを行うので、データベースを全部削除したりとか無茶をやる。無茶をやると「あー、なるほど」と新たな発見もあったりする。また、ローカルにアプリケーションファイル(NekoApp.fp7)を置いても、FMSAサーバの環境と同様に諸機能が動作するかのチェックも行う。


以上