Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 11284] ファイルの概要

コミット

commit 7fc4c07172b7b6feb2da345511ad439fedaf876b
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Thu Jan 19 16:04:26 2012 -0800

    database/sql: move from exp/sql
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5536076

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/7fc4c07172b7b6feb2da345511ad439fedaf876b

元コミット内容

このコミットは、Go言語の標準ライブラリにおいて、実験的なパッケージを格納する exp/sql および exp/sql/driver パッケージを、正式な標準ライブラリの一部である database/sql および database/sql/driver へと移動するものです。これにより、database/sql パッケージがGo 1のリリースに向けて安定版として位置づけられることになります。

変更の背景

Go言語の開発プロセスにおいて、新しい機能やAPIはしばしば exp (experimental) パッケージとして導入されます。exp パッケージは、その名の通り実験的な性質を持ち、APIの変更や削除が予告なく行われる可能性があります。これは、開発者が新しいアイデアを試したり、コミュニティからのフィードバックを収集したりするための「テストグラウンド」として機能します。

database/sql パッケージは、Go言語でSQLデータベースと対話するための汎用的なインターフェースを提供する重要なパッケージです。Go 1のリリースが近づくにつれて、このパッケージが十分に成熟し、安定したAPIを提供できると判断されたため、exp から標準ライブラリの正式な位置へと昇格させる必要がありました。この移動は、database/sql がGo 1の互換性保証の対象となり、プロダクション環境での使用に適していることを示すものです。

前提知識の解説

Go言語の exp パッケージ

Go言語における exp パッケージは、golang.org/x/exp の下に配置される実験的なライブラリ群を指します。これらのパッケージは、Goの標準ライブラリに将来的に組み込まれる可能性のある新機能やAPIのプロトタイプとして機能します。exp パッケージのAPIは不安定であり、Go 1の互換性保証の対象外であるため、プロダクションコードでの使用は推奨されません。しかし、コミュニティが新しい機能を試したり、フィードバックを提供したりする場として非常に重要です。

database/sql パッケージ

database/sql パッケージは、Go言語の標準ライブラリに含まれる、SQLデータベースとの対話のための汎用的なインターフェースを提供するパッケージです。このパッケージ自体は特定のデータベースの実装を含まず、データベースドライバーを介して様々なデータベース(PostgreSQL, MySQL, SQLiteなど)に接続します。database/sql は、接続プール管理、トランザクション、プリペアドステートメントなどの基本的な機能を提供し、Goアプリケーションからデータベースを操作するための基盤となります。

database/sql/driver パッケージ

database/sql/driver パッケージは、database/sql パッケージがデータベースドライバーと連携するためのインターフェースを定義しています。データベースドライバーは、この driver パッケージで定義されたインターフェース(Driver, Conn, Stmt, Rowsなど)を実装することで、database/sql パッケージを介して利用可能になります。これにより、Goアプリケーションはデータベースドライバーの実装詳細を意識することなく、統一されたAPIでデータベースを操作できます。

技術的詳細

このコミットの技術的な変更は、主にファイルパスの変更と、それに伴う参照パスの更新に集約されます。

  1. ファイルパスの変更:

    • src/pkg/exp/sql ディレクトリとそのサブディレクトリ内のすべてのファイルが、src/pkg/database/sql へと移動されました。
    • 同様に、src/pkg/exp/sql/driver ディレクトリとそのサブディレクトリ内のすべてのファイルが、src/pkg/database/sql/driver へと移動されました。
  2. Makefile の更新:

    • Goのビルドシステムは Makefile を利用しており、パッケージのパスが変更されたため、src/pkg/Makefile 内の DIRS 変数から exp/sqlexp/sql/driver が削除され、代わりに database/sqldatabase/sql/driver が追加されました。
    • 各パッケージの Makefile (src/pkg/exp/sql/Makefilesrc/pkg/exp/sql/driver/Makefile がそれぞれ src/pkg/database/sql/Makefilesrc/pkg/database/sql/driver/Makefile にリネームされた後) 内の TARG 変数も、新しいパッケージパスに合わせて更新されました。
  3. Goソースコード内のインポートパスの更新:

    • src/pkg/exp/sql 内のGoソースファイル(例: convert.go, fakedb_test.go, sql.go)では、exp/sql/driver をインポートしていた箇所が database/sql/driver に変更されました。これは、パッケージの物理的な移動に伴い、そのパッケージが提供する型や関数を参照するためのパスも更新する必要があるためです。

これらの変更は、Goのモジュールシステムが導入される前の、Go 1リリース初期のパッケージ管理とビルドプロセスの典型的な例を示しています。当時は、パッケージのパスがファイルシステムの階層構造に直接マッピングされており、パッケージの移動はファイルのリネームと、それに依存するすべてのコードのインポートパスの更新を伴いました。

コアとなるコードの変更箇所

このコミットでは、主に以下のファイルが変更されています。

  • src/pkg/Makefile: ビルド対象ディレクトリのリストを更新。
  • src/pkg/{exp => database}/sql/Makefile: パッケージのターゲット名を更新。
  • src/pkg/{exp => database}/sql/convert.go: exp/sql/driver から database/sql/driver へのインポートパス変更。
  • src/pkg/{exp => database}/sql/convert_test.go: exp/sql/driver から database/sql/driver へのインポートパス変更。
  • src/pkg/{exp => database}/sql/doc.txt: ファイルのリネームのみ。
  • src/pkg/{exp => database}/sql/driver/Makefile: パッケージのターゲット名を更新。
  • src/pkg/{exp => database}/sql/driver/driver.go: ファイルのリネームのみ。
  • src/pkg/{exp => database}/sql/driver/types.go: ファイルのリネームのみ。
  • src/pkg/{exp => database}/sql/driver/types_test.go: ファイルのリネームのみ。
  • src/pkg/{exp => database}/sql/fakedb_test.go: exp/sql/driver から database/sql/driver へのインポートパス変更。
  • src/pkg/{exp => database}/sql/sql.go: exp/sql/driver から database/sql/driver へのインポートパス変更。
  • src/pkg/{exp => database}/sql/sql_test.go: ファイルのリネームのみ。

特に重要な変更は、src/pkg/Makefile と、convert.go, convert_test.go, fakedb_test.go, sql.go 内のインポートパスの変更です。

src/pkg/Makefile の変更

--- a/src/pkg/Makefile
+++ b/src/pkg/Makefile
@@ -59,6 +59,8 @@ DIRS=\
  	crypto/x509\
  	crypto/x509/pkix\
  	crypto/xtea\
++	database/sql\
++	database/sql/driver\
  	debug/dwarf\
  	debug/macho\
  	debug/elf\
@@ -82,8 +84,6 @@ DIRS=\
  	exp/gotype\
  	exp/norm\
  	exp/spdy\
--	exp/sql\
--	exp/sql/driver\
  	exp/ssh\
  	exp/terminal\
  	exp/types\

src/pkg/exp/sql/Makefile (リネーム後 src/pkg/database/sql/Makefile) の変更

--- a/src/pkg/exp/sql/Makefile
+++ b/src/pkg/database/sql/Makefile
@@ -4,7 +4,7 @@
 
 include ../../../Make.inc
 
-TARG=exp/sql
+TARG=database/sql
 GOFILES=\
  	convert.go\
  	sql.go\

src/pkg/exp/sql/convert.go (リネーム後 src/pkg/database/sql/convert.go) の変更

--- a/src/pkg/exp/sql/convert.go
+++ b/src/pkg/database/sql/convert.go
@@ -7,8 +7,8 @@
  package sql
  
  import (
++	"database/sql/driver"
  	"errors"
--	"exp/sql/driver"
  	"fmt"
  	"reflect"
  	"strconv"

コアとなるコードの解説

src/pkg/Makefile の変更

src/pkg/Makefile は、Goの標準ライブラリに含まれるすべてのパッケージのビルドを管理する主要なファイルです。DIRS 変数には、ビルド対象となるパッケージのディレクトリパスがリストされています。このコミットでは、exp/sqlexp/sql/driverDIRS から削除され、代わりに database/sqldatabase/sql/driver が追加されています。これは、ビルドシステムに対して、これらのパッケージが新しい場所にあることを伝え、Go 1の標準ライブラリの一部としてビルドされるように指示するものです。

src/pkg/{exp => database}/sql/Makefile の変更

各パッケージの Makefile には、そのパッケージのビルドに関する情報が含まれています。特に TARG 変数は、そのパッケージの最終的なターゲットパス(インポートパス)を定義します。この変更は、パッケージが exp/sql から database/sql へと正式に昇格したことを反映しており、Goのツールチェーンが正しいインポートパスでパッケージを解決できるようにするために不可欠です。

src/pkg/{exp => database}/sql/convert.go などGoソースコード内のインポートパスの変更

Go言語では、パッケージのインポートパスは、そのパッケージがファイルシステム上のどこに存在するかと密接に関連しています。exp/sql/driver をインポートしていたGoソースファイルは、exp/sql パッケージが database/sql に移動されたことに伴い、database/sql/driver をインポートするように変更されました。これは、Goコンパイラが依存関係を正しく解決し、新しいパッケージパスから driver パッケージの型や関数を見つけられるようにするために必要です。この変更は、パッケージの物理的な移動が、そのパッケージに依存するすべてのコードに影響を与えることを示しています。

これらの変更は、database/sql パッケージがGo 1の標準ライブラリとして安定し、広く利用されるための重要なステップでした。

関連リンク

参考にした情報源リンク