RDS For PostgreSQL
PostgreSQL是一个开源对象云数据库管理系统,并侧重于可扩展性和标准的符合性,被业界誉为“最先进的开源数据库”。云数据库 RDS for PostgreSQL面向企业复杂SQL处理的OLTP在线事务处理场景,支持NoSQL数据类型(JSON/XML/hstore),支持GIS地理信息处理,在可靠性、数据完整性方面有良好声誉,适用于互联网网站、位置应用系统、复杂数据对象处理等应用场景。
- 支持postgis插件,空间应用卓越。
- 适用场景丰富,费用低,随时可以根据业务情况弹性伸缩所需的资源,按需开支,量身订做。
环境准备
本节内容将为您演示如何使用以 Go 语言编写的代码连接到 RDS for PostgreSQL。 同时还介绍了在数据库中查询、插入、更新和删除数据。
项目地址:RDS for PostgreSQL samples
代码连接
-
购买RDS for PostgreSQL实例后,可通过三种连接方式连接实例,你可根据需要选择。Go代码连接方式如下:
// 定义一个初始化数据库的函数 func InitDB() (err error) { // DSN:Data Source Name dsn, err := getDSN() if err != nil { return } Db, err = sql.Open("postgres", dsn) if err != nil { return errors.Wrap(err, "ERR: fail to open postgres") } // 尝试与数据库建立连接(校验dsn是否正确) err = Db.Ping() if err != nil { return errors.Wrap(err, "ERR: fail to connect db") } Db.SetMaxOpenConns(10) Db.SetMaxIdleConns(2) return } -
云数据库参数保存在yaml文件中,关键代码如下:
func getDSN() (dsn string, err error) { config, err := GetConfig() if err != nil { return } user := config.User password := config.Password host := config.Host port := config.Port dbname := config.Dbname dsn = fmt.Sprintf("host=%v port=%v user=%v password=%v dbname=%v sslmode=disable", host, port, user, password, dbname) return }字段说明,如下:
host:数据库IP或者域名(推荐使用内网)
port:数据库实例映射端口
dbname:数据库名
user:数据库用户名
password:数据库密码
基础操作
-
插入数据
//插入数据 func insert(db *sql.DB) error { stmt, err := db.Prepare("INSERT INTO user(user_name,create_time) VALUES($1,$2)") if err != nil { return errors.Wrap(err, "ERR: fail to prepare") } res, err := stmt.Exec("ah", time.Now()) if err != nil { return errors.Wrap(err, "ERR: fail to insert") } fmt.Printf("res = %d", res) return nil } -
更新数据
//更新数据 func update(db *sql.DB) error { stmt, err := db.Prepare("update user set user_name=$1 WHERE u_id=$2") if err != nil { return errors.Wrap(err, "ERR: fail to prepare") } res, err := stmt.Exec("zhangsan", 1) if err != nil { return errors.Wrap(err, "ERR: fail to update") } fmt.Printf("res = %d", res) return nil } -
删除数据
//删除数据 func delete(db *sql.DB) error { stmt, err := db.Prepare("delete from user where user_name=$1") if err != nil { return errors.Wrap(err, "ERR: fail to prepare") } res, err := stmt.Exec("zhangsan") if err != nil { return errors.Wrap(err, "ERR: fail to delete") } fmt.Printf("res = %d", res) return nil } -
查询数据
//查询数据 func query(db *sql.DB) error { rows, err := db.Query("select u_id, user_name, create_time from user where user_name=$1", "ah") if err != nil { return errors.Wrap(err, "ERR: fail to query") } //延迟关闭rows defer rows.Close() for rows.Next() { user := u{} err := rows.Scan(&user.id, &user.user_name, &user.create_time) if err != nil { return errors.Wrap(err, "ERR: fail to scan") } fmt.Printf("id = %v, name = %v, time = %v\n", user.id, user.user_name, user.create_time) } return nil }