文件最后提交记录最后更新时间
3 年前
3 年前
3 年前
3 年前
3 年前
3 年前
README.md

RDS For PostgreSQL

PostgreSQL是一个开源对象云数据库管理系统,并侧重于可扩展性和标准的符合性,被业界誉为“最先进的开源数据库”。云数据库 RDS for PostgreSQL面向企业复杂SQL处理的OLTP在线事务处理场景,支持NoSQL数据类型(JSON/XML/hstore),支持GIS地理信息处理,在可靠性、数据完整性方面有良好声誉,适用于互联网网站、位置应用系统、复杂数据对象处理等应用场景。

  • 支持postgis插件,空间应用卓越。
  • 适用场景丰富,费用低,随时可以根据业务情况弹性伸缩所需的资源,按需开支,量身订做。

环境准备

本节内容将为您演示如何使用以 Go 语言编写的代码连接到 RDS for PostgreSQL。 同时还介绍了在数据库中查询、插入、更新和删除数据。

项目地址:RDS for PostgreSQL samples

环境软件

配置步骤

Go

Go环境配置

Goland

IDE安装

RDS for PostgreSQL

购买RDS for PostgreSQL实例

代码连接

  1. 购买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
    }
    
  2. 云数据库参数保存在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:数据库密码

基础操作

  1. 插入数据

    //插入数据
    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
    }
    
  2. 更新数据

    //更新数据
    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
    }
    
  3. 删除数据

    //删除数据
    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
    }
    
  4. 查询数据

    //查询数据
    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
    }