5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Filemakerからmysqlへテーブル構造コピー

Posted at

背景

  • 社内業務で使っているFilemakerデータベースをmysqlに置き換える案件
  • テーブル構造をコピーしたい
  • フィールド数が500もあるだと!手でやりたくない
  • htmlエクスポートから整形してsql文を作る→方法1
  • Filemakerスクリプトでテーブル構造を作るsql文を作る→方法2
  • ODBC接続を使ってFilemakerスクリプトでテーブルを作る→方法3
  • ODBC接続を使ってFilemakerスクリプトでフィールド追加→方法4
  • テーブル構造ができあがってればcsvエクスポートでデータコピーできる
  • うちの環境:Filemaker pro 11 advanced
  • もっと簡単な方法あるかも

方法1 htmlエクスポートから整形してsql文を作る

  • htmlエクスポートで<TH>に囲まれたフィールド名の羅列が出力される
  • テキストエディタで整形してsql文を作る
  • 手動なので面倒
  • 変なところでエラーすることがない
  • フィールド名は日本語、型はtext、あとで好きなように変える
<HTML>
<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-sjis"></HEAD>
<BODY><TABLE BORDER=1>
<TR>
<TH>商品番号</TH>
<TH>商品名</TH>
<TH>販売価格</TH>
<TH>登録日時</TH>
<TH>修正日時</TH>
<TH>販売停止</TH>
</TR>
...
CREATE TABLE 商品 (
 商品番号 text,
 商品名 text,
 販売価格 text,
 登録日時 text,
 修正日時 text,
 販売停止 text,
)

方法2 Filemakerスクリプトでテーブル構造を作るsql文を作る

  • スクリプトを走らせるだけでsql文ができる単機能
  • 出力用のテキストフィールドをグローバルで用意
  • お手軽
  • ODBC使わないのでシンプル

1.png

変数を設定 [ $sql; 値:"CREATE TABLE 商品 (¶" ]
レコード/検索条件/ページへ移動 [ 最初の ]
フィールドへ移動 [ ローカル::商品番号 ]
Loop
変数を設定 [ $sql; 値:$sql & Get ( アクティブフィールド名 ) & " text" ]
次のフィールドへ移動
Exit Loop If [ Get ( アクティブフィールド名 ) = "sql" ]
変数を設定 [ $sql; 値:$sql & ",¶" ]
End Loop
フィールド設定 [ ローカル::sql; $sql & "¶)" ]
CREATE TABLE 商品 (
商品番号 text,
商品名 text,
販売価格 text,
登録日時 text,
修正日時 text,
販売停止 text
)

##準備

  • 10万件500フィールドもあると操作の度にまたされるので事前準備しておく
  • 1レコードだけ表示しておく
  • フィールド設定でsqlをグローバルで追加
  • レイアウト編集 新規レイアウト リスト 折り返し 全フィールド
  • フォーム形式表示 全フィールドが出てるのを確認
  • スクリプトを編集
  • スクリプト実行
  • 計算フィールドは除外されるようだ

方法3 ODBC接続を使ってFilemakerスクリプトでテーブルを作る

  • OSのODBC接続設定する
  • FM内の外部データソース設定する
  • こんな設定やって手間取るより方法2のが簡単確実
  • データが全て数値であればint型にするとか複雑なスクリプト処理をさせたい時
  • レコードのコピーも書けばできる
変数を設定 [ $sql; 値:"CREATE TABLE 商品 (¶" ]
レコード/検索条件/ページへ移動 [ 最初の ]
フィールドへ移動 [ ローカル::商品番号 ]
Loop
変数を設定 [ $sql; 値:$sql & Get ( アクティブフィールド名 ) & " text" ]
次のフィールドへ移動
Exit Loop If [ Get ( アクティブフィールド名 ) = "sql" ]
変数を設定 [ $sql; 値:$sql & ",¶" ]
End Loop
変数を設定 [ $sql; 値:$sql & "¶)" ]
SQL を実行 [ ODBC データソース: 「fm2sql」; 計算済みの SQL テキスト: $sql ]

方法4 ODBC接続を使ってFilemakerスクリプトでフィールド追加

  • ALTER TABLE ADDを使う
  • フィールド数がとんでもない場合など一発書きが危ういとき
SQL を実行 [ SQL テキスト: CREATE TABLE 商品 ( dummy INT ) ]
レコード/検索条件/ページへ移動 [ 最初の ]
フィールドへ移動 [ ローカル::商品番号 ]
Loop
変数を設定 [ $sql; 値:"ALTER TABLE 商品 ADD " & Get(アクティブフィールド名) & " TEXT;" ]
SQL を実行 [ ODBC データソース: 「fm2sql」; 計算済みの SQL テキスト: $sql ]
次のフィールドへ移動
Exit Loop If [ Get ( アクティブフィールド名 ) = "sql" ]
End Loop
5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?