trdsql ライブラリ使用
trdsqlは初期の頃は、main packageで構成されていましたが、現在はtrdsql packageをmainから呼び出す構成になっていて、trdsql packageをライブラリとして使用できます。
trdsqlのパッケージは、以下の構成になっていて、それぞれ呼び出し可能です。
簡単なサンプルを示します。
package main
import (
"log"
"github.com/noborus/trdsql"
)
func main() {
trd := trdsql.NewTRDSQL(
trdsql.NewImporter(trdsql.InDelimiter(":")),
trdsql.NewExporter(trdsql.NewWriter()),
)
err := trd.Exec("SELECT c1 FROM /etc/passwd")
if err != nil {
log.Fatal(err)
}
}
上記のプログラムは/etc/passwdに対してSQL文を実行しています。 Importer(データベースにインポートするインターフェイス)とExporter(データベースから結果を出力するインターフェイス)を与えてTRDSQLをNewし、Execで実行するのが、おおまかな流れです。
func NewTRDSQL(im Importer, ex Exporter) *TRDSQL
このImporter,Exporterはインターフェイスに沿っていれば、置き換えられます(例えば、SQL内のファイルをインポートするのではなく、独自にインポートするにはImporterのインターフェイスに沿った関数を作成します)。
Importer
デフォルトのImporterは、trdsql.NewImporter()を呼び出せば作成できます。 デフォルトのImporterはtrdsql.Import()でReadOptsのオプションを取ります。ここでフォーマットやその他オプションを渡します。
SQL文にある「/etc/passwd」をデータベースにインポートして使用するのは、デフォルトの動作のため、区切り文字のみ「:」に変更しています。
trdsql.Import()はSQL文を受け取り、必要なファイルをデータベースにインポートします。そのときにファイルの形式に合わせたtrdsql.Readerインターフェイス(各CSV,LTSV,JSON,TBLNのReader)からテーブルへインポートされます。
また、インポートするデータベースによってバルクインサートかCOPYによるインポートを選択してインポートしています。
Exporter
デフォルトのExporterは、trdsql.NewExporter()を呼び出せば作成できます。 SQLでは出力は1つなので、出力する関数(trdsql.NewWriter())を渡しています。 trdsql.NewWriter()はWriteOptsによりフォーマットと動作のオプションを設定して、実際のWriter関数(CSV、LTSV、JSON、TBLN、AT、VF…)によりSQLを実行した結果を書き出します。
Exec
ImporterとExporterの準備が済んでいれば、ExecでSQLを実際に実行します。
- データベース接続
- トランザクションの開始
- Importerでインポートの実行
- Exporterで指定したSQLの実行をして出力
- トランザクションの終了
- データベース切断
参考資料
trdsqlには、参考してファイルからのインポートだけでなく、スライスからインポートする関数が入っています。 それを利用したサンプルが _example/slice/ にあります。
また、trdsql packageを利用してshirou/gopsutilの結果をSQLで取得できるようにしたものが、 noborus/psutilsql です。
trdsqlのgodocも参考にして下さい。