PostgreSQL基础入门和初步实践

PostgreSQL基础入门和初步实践

1. 下载

PostgreSQL官网下载

2. 安装过程

基本一路next,到设置密码的那一步,设置一下自己的密码

3. Mac安装结果

PostgreSQL基础入门和初步实践_第1张图片

4. 命令行操作

  1. 点击上图的SQL Shell,打开命令行工具
  2. 打开以后一路按return键,验证安装是否成功,输入help回车查看指令提示,输入\l(小写L)查看数据库情况,默认3个,template0是干净模板,emplate1可以用于在创建新的数据库前选择使用进入的数据库,否则创建新的数据库会失败
  3. 创建新的数据库 PostgreSQL基础入门和初步实践_第2张图片利用默认的用户名postgres创建新的数据库,也可以使用grant语法创建新的账号操作
    ![建库](https://img-blog.csdnimg.cn/20200610140530718.png
  4. 查看是否创建成功,已经出现了新的mydb数据库![在这里插入图片描述](https://img-blog.csdnimg.cn/20200610141024227.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NTc1OTk0,size_16,color_FFFFFF,t_70
  5. 切换数据库、创建表、添加数据、查询PostgreSQL基础入门和初步实践_第3张图片

5.其他操作学习参考链接

菜鸟教程     数据库常用操作,如切换数据库,查看表结构等

6. PostgreSQL与mysql的比较

  1. 都使用SQL语句操作数据库
  2. 选择、连接数据库、查看索引等操作有出入
  3. 复杂查询,前者有很强大的查询优化器,支持很复杂的查询处理,后者的查询优化器不够成熟
  4. 表增加列,前者只是在数据字典中增加表定义,不会重建表,后者需要重建表和索引,会花很长时间
  5. 索引类型,前者支持四种,后者取决于存储引擎,而且mysql的IInnoDB的表和索引都是按相同的存储方式进行存储,一般要求主键不能太长,而且插入最好是有序递增,否则对性能影响很大
  6. 约束,后者可以对检查约束进行解析,但是不强制实施
  7. 触发器,前者实现方式更多
  8. 身份验证方式,前者有更丰富的认证方法,后者只支持密码认证
  9. 等等

7. golang操作PostgreSQL实例

PostgreSQL基础入门和初步实践_第4张图片

package main

//PostgreSQL的CRUD
import (
	"database/sql"
	"fmt"
	_ "github.com/lib/pq"//必须添加驱动
	"log"
)

const (
	host="localhost"
	post=5432
	user="postgres"
	password="admin"
	dbname="mydb"
)

type userLogin struct {
	uname string
	upassword string
}

type appContext struct {
	db *sql.DB
}

func main()  {
	c,err:=connectDB()
	defer c.db.Close()
	if err!=nil {
		fmt.Println(err)
	}
	c.insert("insert into t_user values('71','71')")//添加
	//c.updateDelete("update t_user set uname=$1 where upassword=$2","hello","123")//更新
	//c.updateDelete("delete from t_user where upassword=$1 ","11234")//删除
	//c.read("select * from t_user")//查询
	fmt.Println("action done!")
}
//数据库连接
func connectDB() (c *appContext, errMessage error) {
	psqlInfo:=fmt.Sprintf("host=%s port=%d user=%s"+" password=%s dbname=%s sslmode=disable",host,post,user,password,dbname)
	db,err:=sql.Open("postgres",psqlInfo)
	if err!=nil {
		fmt.Println("连接数据库错误:"+err.Error())
		return nil,err
	}else {
		fmt.Println("successfully connected!")
	}
	err=db.Ping()
	if err!=nil {
		fmt.Println("DBPing:"+err.Error())
		return nil,err
	}else {
		fmt.Println("DBPingSuccess")
	}
	//返回连接
	return &appContext{db},nil
}
//添加
func (c *appContext)insert(sqlStr string)  {
	_,err :=c.db.Query(sqlStr)
	if err!=nil{
		log.Fatal(err)
	}
	fmt.Println("insert成功:"+sqlStr)
}
//查询
func (c *appContext)read(sqlStr string)  {
	rows,err:=c.db.Query(sqlStr)
	if err!=nil {
		fmt.Println("查询失败"+err.Error())
		return
	}
	defer rows.Close()
	for rows.Next() {
		p:=new(userLogin)
		err:=rows.Scan(&p.uname,&p.upassword)
		if err!=nil {
			fmt.Println(err)
		}
		fmt.Println(p.upassword,p.uname)
	}
	return
}
//更新或者删除
func (c *appContext)updateDelete(sqlStr string, stars ...string)  {
	stmt,err:=c.db.Prepare(sqlStr)
	if err!=nil {
		log.Fatal(err)
	}
	var result sql.Result
	if len(stars)==1 {
		result, _ =stmt.Exec(stars[0]) //删除只需要一个参数
	}else {
		result, _ =stmt.Exec(stars[0], stars[1]) //更新需要两个参数
	}
	if err!=nil {
		log.Fatal(err)
	}
	//影响行数
	affectNum,err:=result.RowsAffected()
	if err!=nil {
		log.Fatal(err)
	}
	fmt.Println("affect rows is ",affectNum)
}

你可能感兴趣的:(GO,#PostgreSQL)