クイック スタート:Go 言語を使用して Azure Database for PostgreSQL - フレキシブル サーバー に接続してデータを照会する
適用対象: Azure Database for PostgreSQL - フレキシブル サーバー
このクイックスタートでは、Go 言語 (golang) で記述されたコードを使用して、Azure Database for PostgreSQL に接続する方法を紹介します。 ここでは、SQL ステートメントを使用してデータベース内のデータを照会、挿入、更新、削除する方法を説明します。 この記事では、Go を使用した開発には慣れているものの、Azure Database for PostgreSQL の使用は初めてであるユーザーを想定しています。
前提条件
このクイックスタートでは、次のいずれかのガイドで作成されたリソースを出発点として使用します。
重要
このクイックスタートでは、パブリック アクセス (許可された IP アドレス) が有効になっているサーバーの使用をお勧めします。 プライベート アクセス (VNET 統合) が有効になっているサーバーを使用して、このクイックスタートを完了するには、説明されていない追加の手順が必要になる場合があります。
Azure portal または Azure CLI を使用して、接続元の IP アドレスにサーバーのファイアウォール規則が追加されていることを確認します。
Go と pq コネクタのインストール
Go と純粋な Go postgres ドライバー (pq) を自分のコンピューターにインストールします。 プラットフォームに応じて、該当する手順に従ってください。
スタート メニューからコマンド プロンプトを起動します。
プロジェクト用のフォルダーを作成します (例:
mkdir %USERPROFILE%\go\src\postgresqlgo
)。ディレクトリをプロジェクト フォルダーに変更します (例:
cd %USERPROFILE%\go\src\postgresqlgo
)。GOPATH の環境変数がソース コード ディレクトリをポイントするように設定します。 [https://login.microsoftonline.com/consumers/](
set GOPATH=%USERPROFILE%\go
)go mod init を実行して、現在のディレクトリ内にモジュールを作成します。 (例:
go mod init postgresqlgo
)。<module_path>
パラメーターは通常、GitHub リポジトリ内の場所です (github.com/<your_github_account_name>/<directory>
など)。- コマンドライン アプリをテストとして作成し、アプリを公開しない場合は、
<module_path>
で実際の場所を参照する必要はありません。 たとえば、postgresqlgo
のようにします。
go get github.com/lib/pq
コマンドを実行して、純粋な Go Postgres ドライバー (pq) をインストールします。まとめると、Go をインストールしてから、コマンド プロンプトで以下のコマンドを実行します。
mkdir %USERPROFILE%\go\src\postgresqlgo cd %USERPROFILE%\go\src\postgresqlgo set GOPATH=%USERPROFILE%\go go mod init postgresqlgo go get github.com/lib/pq
接続情報の取得
Azure Database for PostgreSQL に接続するために必要な接続情報を取得します。 完全修飾サーバー名とログイン資格情報が必要です。
- Azure Portal にログインします。
- Azure portal の左側のメニューにある [すべてのリソース] を選択し、作成したサーバー (例: mydemoserver) を検索します。
- サーバー名を選択します。
- サーバーの [概要] パネルから、 [サーバー名] と [サーバー管理者ログイン名] を書き留めます。 パスワードを忘れた場合も、このパネルからパスワードをリセットすることができます。
Go コードのビルドと実行
- Golang コードを書くには、Microsoft Windows のメモ帳、Ubuntu の vi や Nano、macOS の TextEdit などのプレーンテキスト エディターを使用できます。 充実した対話的な開発環境 (IDE) の方が好ましい場合は、Jetbrains の GoLand、Microsoft の Visual Studio Code、または Atom をお試しください。
- 以下のセクションからテキスト ファイルに Golang コードを貼り付け、 *.go というファイル拡張子でプロジェクト フォルダーに保存します。たとえば、Windows の場合は
%USERPROFILE%\go\src\postgresqlgo\createtable.go
に、Linux の場合は~/go/src/postgresqlgo/createtable.go
に保存します。 - コード内で
HOST
、DATABASE
、USER
、およびPASSWORD
の定数を見つけて、サンプルの値を独自の値で置き換えます。 Azure Database for PostgreSQL サーバー インスタンスを作成すると、postgres という名前の既定のデータベースも作成されます。 そのデータベースまたは作成した別のデータベースを使用できます。 - コマンド プロンプトまたは Bash シェルを起動します。 ディレクトリをプロジェクト フォルダーに変更します。 たとえば Windows の場合、「
cd %USERPROFILE%\go\src\postgresqlgo\
」と入力します。 Linux の場合は、「cd ~/go/src/postgresqlgo/
」と入力します。 前述した一部の IDE 環境では、シェル コマンドを必要とせずに、デバッグとランタイムの機能が提供されています。 - コマンド「
go run createtable.go
」を入力してコードを実行し、アプリケーションをコンパイルして実行します。 - または、コードをネイティブ アプリケーションとしてビルドするには、
go build createtable.go
を実行し、createtable.exe
を起動してアプリケーションを実行します。
接続とテーブルの作成
接続し、CREATE TABLE SQL ステートメントでテーブルを作成してから、INSERT INTO SQL ステートメントでそのテーブルに行を追加するには、次のコードを使用します。
このコードでは、3 つのパッケージをインポートします。sql パッケージ、PostgreSQL サーバーと通信するためのドライバーである pq パッケージ、コマンド ラインで入力と出力を表示するための fmt パッケージです。
このコードでは、sql.Open() メソッドを呼び出して Azure Database for PostgreSQL データベースに接続し、db.Ping() メソッドを使用してその接続を確認します。 データベース ハンドルが全体を通して使用され、データベース サーバーの接続プールが保持されます。 このコードでは、複数の SQL コマンドを実行するために Exec() メソッドを数回呼び出しています。 毎回、エラーが発生したかどうかがカスタム checkError() メソッドによってチェックされ、エラーが発生した場合は panic によってプログラムが終了します。
HOST
、DATABASE
、USER
、PASSWORD
の各パラメーターは、実際の値に置き換えてください。
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
const (
// Initialize connection constants.
HOST = "mydemoserver.postgres.database.azure.com"
DATABASE = "postgres"
USER = "mylogin"
PASSWORD = "<server_admin_password>"
)
func checkError(err error) {
if err != nil {
panic(err)
}
}
func main() {
// Initialize connection string.
var connectionString string = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)
// Initialize connection object.
db, err := sql.Open("postgres", connectionString)
checkError(err)
err = db.Ping()
checkError(err)
fmt.Println("Successfully created connection to database")
// Drop previous table of same name if one exists.
_, err = db.Exec("DROP TABLE IF EXISTS inventory;")
checkError(err)
fmt.Println("Finished dropping table (if existed)")
// Create table.
_, err = db.Exec("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
checkError(err)
fmt.Println("Finished creating table")
// Insert some data into table.
sql_statement := "INSERT INTO inventory (name, quantity) VALUES ($1, $2);"
_, err = db.Exec(sql_statement, "banana", 150)
checkError(err)
_, err = db.Exec(sql_statement, "orange", 154)
checkError(err)
_, err = db.Exec(sql_statement, "apple", 100)
checkError(err)
fmt.Println("Inserted 3 rows of data")
}
データの読み取り
接続し、SELECT SQL ステートメントを使用してデータを読み取るには、次のコードを使用します。
このコードでは、3 つのパッケージをインポートします。sql パッケージ、PostgreSQL サーバーと通信するためのドライバーである pq パッケージ、コマンド ラインで入力と出力を表示するための fmt パッケージです。
このコードでは、sql.Open() メソッドを呼び出して Azure Database for PostgreSQL データベースに接続し、db.Ping() メソッドを使用してその接続を確認します。 データベース ハンドルが全体を通して使用され、データベース サーバーの接続プールが保持されます。 SELECT クエリは db.Query() メソッドの呼び出しによって実行され、結果の行は rows 型の変数に保持されます。 このコードでは、rows.Scan() メソッドを使用して、現在の行にある列データの値を読み取り、すべての行の読み取りが済むまで、rows.Next() 反復子を使用して行に対してループ処理します。 各行の列の値がコンソールに表示されます。毎回、エラーが発生したかどうかがカスタム checkError() メソッドを使用してチェックされ、エラーが発生した場合は panic によってプログラムが終了します。
HOST
、DATABASE
、USER
、PASSWORD
の各パラメーターは、実際の値に置き換えてください。
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
const (
// Initialize connection constants.
HOST = "mydemoserver.postgres.database.azure.com"
DATABASE = "postgres"
USER = "mylogin"
PASSWORD = "<server_admin_password>"
)
func checkError(err error) {
if err != nil {
panic(err)
}
}
func main() {
// Initialize connection string.
var connectionString string = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)
// Initialize connection object.
db, err := sql.Open("postgres", connectionString)
checkError(err)
err = db.Ping()
checkError(err)
fmt.Println("Successfully created connection to database")
// Read rows from table.
var id int
var name string
var quantity int
sql_statement := "SELECT * from inventory;"
rows, err := db.Query(sql_statement)
checkError(err)
defer rows.Close()
for rows.Next() {
switch err := rows.Scan(&id, &name, &quantity); err {
case sql.ErrNoRows:
fmt.Println("No rows were returned")
case nil:
fmt.Printf("Data row = (%d, %s, %d)\n", id, name, quantity)
default:
checkError(err)
}
}
}
データの更新
接続し、UPDATE SQL ステートメントを使用してデータを更新するには、次のコードを使用します。
このコードでは、3 つのパッケージをインポートします。sql パッケージ、Postgres サーバーと通信するためのドライバーである pq パッケージ、コマンド ラインで入力と出力を表示するための fmt パッケージです。
このコードでは、sql.Open() メソッドを呼び出して Azure Database for PostgreSQL データベースに接続し、db.Ping() メソッドを使用してその接続を確認します。 データベース ハンドルが全体を通して使用され、データベース サーバーの接続プールが保持されます。 このコードでは、テーブルを更新する SQL ステートメントを実行するために Exec() メソッドを呼び出しています。 エラーが発生したかどうかがカスタム checkError() メソッドを使用してチェックされ、エラーが発生した場合は panic によってプログラムが終了します。
HOST
、DATABASE
、USER
、PASSWORD
の各パラメーターは、実際の値に置き換えてください。
package main
import (
"database/sql"
_ "github.com/lib/pq"
"fmt"
)
const (
// Initialize connection constants.
HOST = "mydemoserver.postgres.database.azure.com"
DATABASE = "postgres"
USER = "mylogin"
PASSWORD = "<server_admin_password>"
)
func checkError(err error) {
if err != nil {
panic(err)
}
}
func main() {
// Initialize connection string.
var connectionString string =
fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)
// Initialize connection object.
db, err := sql.Open("postgres", connectionString)
checkError(err)
err = db.Ping()
checkError(err)
fmt.Println("Successfully created connection to database")
// Modify some data in table.
sql_statement := "UPDATE inventory SET quantity = $2 WHERE name = $1;"
_, err = db.Exec(sql_statement, "banana", 200)
checkError(err)
fmt.Println("Updated 1 row of data")
}
データの削除
接続し、DELETE SQL ステートメントを使用してデータを削除するには、次のコードを使用します。
このコードでは、3 つのパッケージをインポートします。sql パッケージ、Postgres サーバーと通信するためのドライバーである pq パッケージ、コマンド ラインで入力と出力を表示するための fmt パッケージです。
このコードでは、sql.Open() メソッドを呼び出して Azure Database for PostgreSQL データベースに接続し、db.Ping() メソッドを使用してその接続を確認します。 データベース ハンドルが全体を通して使用され、データベース サーバーの接続プールが保持されます。 このコードでは、テーブルから行を削除する SQL ステートメントを実行するために Exec() メソッドを呼び出しています。 エラーが発生したかどうかがカスタム checkError() メソッドを使用してチェックされ、エラーが発生した場合は panic によってプログラムが終了します。
HOST
、DATABASE
、USER
、PASSWORD
の各パラメーターは、実際の値に置き換えてください。
package main
import (
"database/sql"
_ "github.com/lib/pq"
"fmt"
)
const (
// Initialize connection constants.
HOST = "mydemoserver.postgres.database.azure.com"
DATABASE = "postgres"
USER = "mylogin"
PASSWORD = "<server_admin_password>"
)
func checkError(err error) {
if err != nil {
panic(err)
}
}
func main() {
// Initialize connection string.
var connectionString string =
fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=require", HOST, USER, PASSWORD, DATABASE)
// Initialize connection object.
db, err := sql.Open("postgres", connectionString)
checkError(err)
err = db.Ping()
checkError(err)
fmt.Println("Successfully created connection to database")
// Delete some data from table.
sql_statement := "DELETE FROM inventory WHERE name = $1;"
_, err = db.Exec(sql_statement, "orange")
checkError(err)
fmt.Println("Deleted 1 row of data")
}
リソースをクリーンアップする
このクイックスタートで使用したすべてのリソースをクリーンアップするには、次のコマンドを使用してリソース グループを削除します。
az group delete \
--name $AZ_RESOURCE_GROUP \
--yes