5

現在、Go で SQL データベース (Postgres および Mysql) 用のテスト プログラムを作成しています。パッケージの「_」オプションについてはよくわかりませんが、使用しています(以下を参照)。

私ができるようにしたいのは、一度コンパイルして、1 つの RDBMS と複数の RDBMS に対して複数の SQL ドライバーを使用し、プログラムを実行するときに、使用するドライバーと RDBMS を選択することです。それが可能かどうかはわかりません。現在、1 つの Postgres と 1 つの Mysql ドライバーでコンパイルし、実行時にどちらを使用しているかを選択します (Postgres/Mysql)。これで問題なく動作しますが、どのドライバーがコンパイルされたかを覚えておく必要があります。1 つの RDBMS に対して複数のドライバーを使用してコンパイルし、実行時に使用するドライバーを選択できるとよいでしょう。それは不可能だと思います。あるいは、コンパイル時にどのドライバを使用するかを選択し、実行時にどのドライバが使用されているかを知ることができるとよいでしょう。これらの機能のいずれかがなければ、たとえばテストすることができます。

特定のドライバーを選択するコンパイラ オプションを使用して、実行時にどのドライバーが使用されているかを知ることは可能ですか? 別の方法として、これを示すようにプログラムを編集することは明らかです。

インポートの例は次のとおりです。

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    ////_ "github.com/lib/pq"
    _ "github.com/lxn/go-pgsql"
 ........
4

1 に答える 1

8

パッケージの「_」オプションについてはよくわかりませんが、使用しています(以下を参照)。

_インポート パスの先頭に追加すると、パッケージは通常通りにインポートされますが (その機能を実行して) init()、現在のパッケージの名前がインポートされたパッケージに関連付けられることはありません。

私ができるようにしたいのは、一度コンパイルして、1 つの RDBMS と複数の RDBMS に対して複数の SQL ドライバーを使用し、プログラムを実行するときに、使用するドライバーと RDBMS を選択することです。それが可能かどうかはわかりません。

init()パッケージの機能"github.com/go-sql-driver/mysql"は次のことを行います。

func init() {
        sql.Register("mysql", &MySQLDriver{})
}

database/sql次のように定義されているのRegister関数を呼び出します。

func Register(name string, driver driver.Driver)

そして条件があります:

Register が同じ名前で 2 回呼び出された場合、または driver が nil の場合、パニックが発生します。

ドライバーが登録されると、以下を使用できますsql.Open

func Open(driverName, dataSourceName string) (*DB, error)

最初の引数で指定されたドライバを使用して、データベースへの新しい接続を開きます。例:

db, e := sql.Open("mysql", "user:pass@host:port")

ちなみに、github.com/lxn/go-pgsqlinit()関数は次のようになります。

func init() {
        sql.Register("postgres", sqlDriver{})
}

あなたの質問を読み直しましたが、さらに、プログラムを実行するときに使用するデータベースとドライバーを指定したいと思います。

このために、flagパッケージを使用して、次のようにアプリケーションを実行できます。

./my_app -driver=mysql -db="user:pass@host:port"

これらの文字列を に渡しますsql.Open

于 2013-10-23T15:47:53.630 に答える