本快速入门演示如何使用以 Go 语言 (golang) 编写的代码连接到 Azure Database for PostgreSQL。 同时还介绍了如何使用 SQL 语句在数据库中查询、插入、更新和删除数据。 本文假设你熟悉使用 Go 进行开发,但不熟悉如何使用 Azure Database for PostgreSQL。
先决条件
本快速入门使用在 创建 Azure Database for PostgreSQL 中的资源作为基础。
重要
在本快速入门中,使用启用了 公共访问(允许的 IP 地址) 的服务器。 使用启用了“专用访问(VNet 集成)”的服务器完成本快速入门可能涉及未涵盖的额外步骤。
安装 Go 和 pq 连接器
在自己的计算机上安装 Go 和纯 Go 语言 Postgres 驱动程序 (pq)。 根据自己的平台执行相应步骤:
从开始菜单启动命令提示符。
为项目创建文件夹,例如
mkdir %USERPROFILE%\go\src\postgresqlgo。将目录转到项目文件夹,例如
cd %USERPROFILE%\go\src\postgresqlgo。设置 GOPATH 的环境变量,使之指向源代码目录。
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,然后在命令提示符处运行以下命令:
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 门户。
- 在 Azure 门户的左侧菜单中,选择 “所有资源”,然后搜索创建的服务器(例如 mydemoserver)。
- 选择服务器名称。
- 从服务器的“概览”面板中记下“服务器名称”和“服务器管理员登录名”。 如果忘记了密码,也可通过此面板来重置密码。
生成和运行 Go 代码
- 若要编写 Go 代码,请使用纯文本编辑器,例如Microsoft Windows中的记事本、Ubuntu 中的 Nano 或 macOS 中的 TextEdit。 如果你更喜欢功能更丰富的集成开发环境(IDE),可以试试 JetBrains 的 GoLand、微软的 Visual Studio Code 或 Atom。
- 将以下部分中的 Go 代码粘贴到文本文件中,并将其保存到文件扩展名为 *.go 的项目文件夹中,例如Windows路径
%USERPROFILE%\go\src\postgresqlgo\createtable.go或 Linux 路径~/go/src/postgresqlgo/createtable.go。 - 在代码中找到
HOST、DATABASE、USER、PASSWORD常量,将示例值替换为自己的值。 创建Azure Database for PostgreSQL服务器时,将创建名为 postgres 的数据库。 可以使用该数据库或你创建的另一个数据库。 - 启动命令提示符或 Bash Shell。 将目录转到项目文件夹。 例如,在Windows上,使用
cd %USERPROFILE%\go\src\postgresqlgo\。 在 Linux 上,使用cd ~/go/src/postgresqlgo/。 提到的某些 IDE 环境提供不需 shell 命令的调试和运行时功能。 - 通过键入命令
go run createtable.go来运行代码,编译并运行应用程序。 - 或者,若要将代码生成到本机应用程序中,请使用
go build createtable.go。 然后,启动createtable.exe以运行应用程序。
进行连接并创建表
使用以下代码通过 CREATE TABLE SQL 语句连接和创建表,后跟 INSERT INTO SQL 语句将行添加到表中。
代码将导入三个包:sql 包、pq 包(充当与 PostgreSQL 服务器通信所需的驱动程序)以及 fmt 包(用于命令行中的打印输入和输出)。
代码调用 sql.Open() 方法来连接到 Azure Database for PostgreSQL 数据库,并使用 db.Ping() 方法检查连接是否成功。 将始终使用数据库句柄来存储数据库服务器的连接池。 代码多次调用 Exec() 方法来运行多个 SQL 命令。 每次都会由自定义的 checkError() 方法检查是否发生了错误,如果确实发生了错误,就会触发 panic 并退出。
将 HOST、DATABASE、USER 和 PASSWORD 参数替换为你自己的值。
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
const (
// Initialize connection constants.
HOST = "mydemoserver.postgres.database.chinacloudapi.cn"
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 语句读取数据。
代码将导入三个包:sql 包、pq 包(充当与 PostgreSQL 服务器通信所需的驱动程序)以及 fmt 包(用于命令行中的打印输入和输出)。
代码调用 sql.Open() 方法来连接到 Azure Database for PostgreSQL 数据库,并使用 db.Ping() 方法检查连接是否成功。 将始终使用数据库句柄来存储数据库服务器的连接池。 选择查询通过调用方法 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.chinacloudapi.cn"
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 语句更新数据。
代码导入三个包:sql 包、pq 包(充当与 Postgres 服务器通信所需的驱动程序)以及 fmt 包(适用于在命令行中列显的输入和输出)。
代码调用方法 sql.Open() 连接到 Azure Database for PostgreSQL 数据库,并使用方法 db.Ping() 检查连接。 将始终使用数据库句柄来存储数据库服务器的连接池。 代码通过调用 Exec() 方法来运行 SQL 语句,以便更新表。 使用自定义 checkError() 方法检查是否发生错误,以及是否在发生错误时死机退出。
将 HOST、DATABASE、USER 和 PASSWORD 参数替换为你自己的值。
package main
import (
"database/sql"
_ "github.com/lib/pq"
"fmt"
)
const (
// Initialize connection constants.
HOST = "mydemoserver.postgres.database.chinacloudapi.cn"
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 语句删除数据。
代码导入三个包:sql 包、pq 包(充当与 Postgres 服务器通信所需的驱动程序)以及 fmt 包(适用于在命令行中列显的输入和输出)。
代码调用方法 sql.Open() 连接 Azure Database for PostgreSQL,并通过调用方法 db.Ping() 来检查连接。
数据库句柄保存数据库服务器的连接池,并在整个过程中使用。 代码通过调用 Exec() 方法来运行 SQL 语句,以便从表中删除行。 自定义 checkError() 方法检查是否发生了错误,如果发生错误,则退出。
将 HOST、DATABASE、USER 和 PASSWORD 参数替换为你自己的值。
package main
import (
"database/sql"
_ "github.com/lib/pq"
"fmt"
)
const (
// Initialize connection constants.
HOST = "mydemoserver.postgres.database.chinacloudapi.cn"
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
相关内容
- 使用 Azure 门户管理 Azure Database for PostgreSQL。
- 快速入门:使用 Python 连接和查询 Azure Database for PostgreSQL 中的数据。
- 快速入门:使用 Java 从 Azure Database for PostgreSQL 连接和查询数据。
- 快速入门:使用 .NET(C#)从 Azure Database for PostgreSQL 连接和查询数据。
- 快速入门:使用 PHP 从 Azure Database for PostgreSQL 连接和查询数据。
- 快速入门:使用 Azure CLI 从 Azure Database for PostgreSQL 连接和查询数据。
- 快速入门:从 Power BI 中的 Azure Database for PostgreSQL 导入数据。