2013/08/05

Recent entries from same category

  1. Go 言語プログラミングエッセンスという本を書きました。
  2. errors.Join が入った。
  3. unsafe.StringData、unsafe.String、unsafe.SliceData が入った。
  4. Re: Go言語で画像ファイルか確認してみる
  5. net/url に JoinPath が入った。

最近バージョン1リリースを目標にガチャガチャと凄い勢いでパッケージ構成が見直されていますが、その中でGo言語向けに新しいパッケージが入りました。
これまででもsqlite3やmysql向けに何人もの人が個性的なドライバを書き、インタフェースも揃わず、中には開発をやめ、それを使ったアプリケーションの開発も止まるという悪循環になろうとしていました。
そんな中入ったのがdatabase/sqlです。Go言語としてはデータベースの枠組みだけ提供し、ドライバはサードパーティに作ってもらうというもくろみです。これによりデータベースに関してはドライバを構成通りに開発すれば使用者側は同じインタフェースで呼び出せるという物です。PerlでいうDBIですね。

誰もあまり手を付けてなさそうだったので、3本ばかしドライバを書かせて頂きました。

SQLite3

mattn/go-sqlite3 - GitHub

sqlite3 driver for go that using database/sql

https://github.com/mattn/go-sqlite3
ご存知、みんな大好きSQLite3ですね。golang-gonutsに放流した時にはなかなか反響がよろしくて良かったです。
ちなみにこれを使ってデータベースを扱うコードを書くと、こんな感じになります。
package main

import (
    "database/sql"
    "fmt"
    _ "github.com/mattn/go-sqlite3"
    "os"
)

func main() {
    os.Remove("./foo.db")

    db, err := sql.Open("sqlite3""./foo.db")
    if err != nil {
        fmt.Println(err)
        return
    }

    sqls := []string{
        "create table foo (id integer not null primary key, name text)",
        "delete from foo",
    }
    for _, sql := range sqls {
        _, err = db.Exec(sql)
        if err != nil {
            fmt.Printf("%q: %s\n", err, sql)
            return
        }
    }

    tx, err := db.Begin()
    if err != nil {
        fmt.Println(err)
        return
    }
    stmt, err := tx.Prepare("insert into foo(id, name) values(?, ?)")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer stmt.Close()

    for i := 0; i < 100; i++ {
        _, err = stmt.Exec(i, fmt.Sprintf("こんにちわ世界%03d", i))
        if err != nil {
            fmt.Println(err)
            return
        }
    }
    tx.Commit()

    rows, err := db.Query("select id, name from foo")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name string
        rows.Scan(&id, &name)
        println(id, name)
    }
}

Microsoft ActiveX Object DataBase

mattn/go-adodb - GitHub

Microsoft ActiveX Object DataBase driver for go that using database/sql

https://github.com/mattn/go-adodb
まだまだCOMは死んでない。いまだに使われてるADODBをCGOを使わずに実装したgo-oleを使い、データベース操作出来る様にしました。
mattn/go-ole - GitHub

win32 ole implementation for golang

https://github.com/mattn/go-ole
ちなみにこれを使うと、AccessのMDBファイルを弄れたりCSVファイルにSQLを流せたり出来ます。便利!
こちらについては1人だけでしたが「Cool!」を頂きました。良かったですね。そうですね。

Yahoo! Query Language

mattn/go-yql - GitHub

YQL database driver for golang.

https://github.com/mattn/go-yql
これを使うとSQLでRSSがセレクト出来たりして嬉しいのですが... package main

import (
    "database/sql"
    "fmt"
    _ "github.com/mattn/go-yql"
)

func main() {
    db, _ := sql.Open("yql""")

    stmt, err := db.Query(
        "select * from rss where url = ?",
        "http://blog.golang.org/feeds/posts/default?alt=rss")
    if err != nil {
        fmt.Println(err)
        return
    }
    for stmt.Next() {
        var data map[string]interface{}
        stmt.Scan(&data)
        fmt.Printf("%v\n", data["link"])
        fmt.Printf("  %v\n\n", data["title"])
    }
}
いかんせん、Googleプロダクトの言語なので、「YQLドライバ作ったよ!」なんて言えずにおそらくお蔵入りするかと思います。

追記
ちなみに僕の思惑では、おそらく今後Google App EngineはRDBMSを採用する事になって(有料かもね)、そのエンジン構成としてこれを使わせるんじゃないかなと思っています。例えばappspotではGoogleが提供する(中身は何かは知らない)RDBMSで、ローカルの開発環境向けにはSQLiteみたいな...。
Posted at by