目录

一、 引言

1.1 PostgreSQL与MYSQL

1.2 Golang支持PostgreSQl驱动

二、编码实践

2.1 建表语句

2.2 CRUD代码

2.3 验证结果

三、结语


一、 引言

1.1 PostgreSQL与MYSQL

PostgreSQl是一个自由的对象——关系型数据库服务器(数据库管理系统)。同时,它也是除了开源数据库系统(如Mysql和Firebird)和专有系统(如Oracle、Sybase、IBM的DB2和Microsoft SQL Server)外的一种选择。

PostgreSQL和Mysql相比较,它更加庞大一些,因为它设计初衷就是用来替代Oracle的,所以在企业应用中采用PostgreSQL也是一种不错的选择。

自从Mysql被Oracle收购以后正在逐步封闭(自MYSQL 5.5.31以后的所有版本将不再遵守GPL协议)。也许将来会有更多的人选择PostgreSQL,而不是将Mysql作为项目的后端数据库。

1.2 Golang支持PostgreSQl驱动

Golang实现的支持PostgreSQL的驱动很多,毕竟很多外国人在开发中使用了PostgreSQL。以下将列出驱动:

  • https://github.com/lib/pqhttps://github.com/lib/pq 支持database/sql驱动,纯Golang语言编写
  • GitHub - jbarham/gopgsqldriver: PostgreSQL driver for the Go SQL database packagePostgreSQL driver for the Go SQL database package. Contribute to jbarham/gopgsqldriver development by creating an account on GitHub.https://github.com/jbarham/gopgsqldriver 支持database/sql驱动,纯Golang语言编写
  • GitHub - lxn/go-pgsql: A PostgreSQL client package for the Go Programming LanguageA PostgreSQL client package for the Go Programming Language - GitHub - lxn/go-pgsql: A PostgreSQL client package for the Go Programming Languagehttps://github.com/lxn/go-pgsql 支持database/sql,纯Golang语言编写

本文中将使用第一个驱动,目前使用它的人最多,且在github上更活跃。

二、编码实践

2.1 建表语句

CREATE TABLE "public"."person" ("id" int8 NOT NULL DEFAULT nextval('user_id_seq'::regclass),"name" varchar(255) COLLATE "pg_catalog"."default","depart_name" varchar(255) COLLATE "pg_catalog"."default","create_at" date
)

可以看见我的数据库名叫 postgres, 表名叫 person

2.2 CRUD代码

package mainimport ("database/sql""fmt"_ "github.com/lib/pq"
)type User struct {id         int64name       stringdepartName stringcreateAt   string
}func main() {db, err := sql.Open("postgres", "host=192.168.58.128 port=5432 user=postgres password=password dbname=postgres sslmode=disable")checkErr(err)personId := insertUserReturnId(db)insertUser(db)updateUser(db, personId)user := queryUser(db, personId)fmt.Println("查询结果", user)deleteUser(db, personId)db.Close()
}// 新增用户
func insertUserReturnId(db *sql.DB) (personId int) {var lastInsertId intdb.QueryRow("insert into person(name,depart_name,create_at) values($1,$2,$3) returning id;", "朱八", "公关部", "2000-10-10").Scan(&lastInsertId)fmt.Println("插入返回的主键id=", lastInsertId)return lastInsertId
}// 新增用户不返回id
func insertUser(db *sql.DB) {stmt, err := db.Prepare("insert into person(name,depart_name,create_at) values($1,$2,$3) returning id")checkErr(err)_, err = stmt.Exec("朱八2", "公关部2", "2000-10-10")checkErr(err)// postgresql没有类似Mysql的自增id,不支持以下函数(LastInsertId),可以注释掉以下三行代码//id, err := res.LastInsertId()//checkErr(err)//fmt.Println("生成主键(不支持时,默认0)", id)
}// 更新用户
func updateUser(db *sql.DB, personId int) {stmt, err := db.Prepare("update person set name=$1 where id =$2")checkErr(err)res, err := stmt.Exec("朱八改", personId)checkErr(err)affected, err := res.RowsAffected()checkErr(err)fmt.Println("更改数据作用数->", affected)
}// 查询用户
func queryUser(db *sql.DB, personId int) (result []User) {rows, err := db.Query("select name,depart_name,create_at,id from person where id =$1", personId)checkErr(err)users := []User{}for rows.Next() {user := User{}err := rows.Scan(&user.name, &user.departName, &user.createAt, &user.id)checkErr(err)users = append(users, user)fmt.Println("循环查询打印的值=>", user)}return users
}// 删除用户
func deleteUser(db *sql.DB, personId int) {stmt, err := db.Prepare("delete from person where id=$1")checkErr(err)res, err := stmt.Exec(personId)checkErr(err)affected, err := res.RowsAffected()checkErr(err)fmt.Println("删除作用数", affected)
}func checkErr(err error) {if err != nil {panic(err)}
}

2.3 验证结果

三、结语

  1. Mysql传参用的是 ?,而PostgreSQL通过$1、$2、$3方式制定要传递的参数。
  2. sql.open中 dataSourceName也与Mysql的不同。
  3. 由于PostgreSQL不支持LastInsertId函数,所以无法在stmt.Exec执行后返回res的自增id。
  4. 不用链接时注意关闭db.

[Golang数据库专题4]Golang语言操作PostgreSQL进行增删改查相关推荐

  1. [Golang数据库专题3]Golang语言操作SQLite3进行增删改查

    目录 一.SQLite3安装(linux) 1.2 在线安装 开始安装 目录下创建db 执行表创建语句 二.方案选型 三.编写代码 3.1 代码运行环境准备 Go语言环境 SQLite3生成db 3. ...

  2. 数据库学习5-高级数据操作1(增删改查)

    目录 新增数据 多数据插入 主键冲突 蠕虫复制 更新数据 删除数据 查询数据 from数据源 单表数据 多表数据 动态数据 where子句 group by子句 分组统计 多分组 分组排序 回溯统计 ...

  3. 怎么用php操作mysql删除数据库代码_如何使用php操作mysql的增删改查?

    php操作mysql的增删改查方法:1.插入语句[insert into 数据表名(字段1,字段2,....) values("值1","值2",..)]:2. ...

  4. 【node】Sequelize常用操作、基本增删改查

    [node]Sequelize常用操作.基本增删改查 sequelize初始化 先初始化一个数据库实例 再初始化一个model实例 sequelize的数据类型 基本增删改查的写法 SELECT * ...

  5. eggjs增删改查MySQL,nodejs操作mysql实现增删改查

    首先需要安装mysql模块:npm install mysql –save 然后创建user数据表: 接着使用nodejs对数据库进行增删改查: //引入mysql模块 var mysql = req ...

  6. nodejs mysql 增删改查_nodejs操作mysql实现增删改查的实例

    首先需要安装mysql模块:npm install mysql --save 然后创建user数据表: 接着使用nodejs对数据库进行增删改查: .[活动]2017 CSDN博客专栏评选 [评论送书 ...

  7. GZFramwork数据库层《四》单据主从表增删改查

    同GZFramwork数据库层<三>普通主从表增删改查 不同之处在于:实例 修改为: 直接上效果: 项目源码下载地址:https://github.com/GarsonZhang/GZFr ...

  8. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  9. SpringBoot操作MongoDB实现增删改查

    本篇博客主讲如何使用SpringBoot操作MongoDB. SpringBoot操作MongoDB实现增删改查 (1)pom.xml引入依赖 <dependency> <group ...

最新文章

  1. stl string常用函数
  2. PCLint使用(一)
  3. class根据状态 vue_系统学习 vue 中使用 css 的各种方式
  4. 前端开发常用的Chrome插件推荐
  5. Ext 3.0 +ASP.NET2.0 可视化开发介绍
  6. SpringBoot入门教程
  7. 一种牛逼的网站分享插件实现
  8. 老鸟的Python新手教程
  9. Tomcat如果默认8080被占用修改端口号和查询端口号地址
  10. Android setOnPageChangeListener 过时解决
  11. VOS中历史话单显示通话会话超时中断详解
  12. SQL基本语法总结(含SQL代码)
  13. 【长期更新】Linux学习笔记
  14. scrt上传下载文件
  15. element-ui在打开两个对话框时出现阴影的解决办法
  16. fedora14命令行界面自动root权限登录
  17. c语言温度转换作业帮,C++摄氏度和华氏度互相转化
  18. xp计算机组策略怎么打开,打开组策略的命令,教你组策略怎么打开!
  19. win7计算机评分,终于全7.9!编辑冲击Win7系统分级满分
  20. 代码随想录第四天 leetcode 24、19、206

热门文章

  1. shopnc b2b2c wap支付宝付款,提示,系统繁忙,请稍候再试(ali14)
  2. [C++]学习笔记——模板
  3. 汽车仪表自动化校验套件 FOne AutoTest-Meter (汽车仪表自动化测试)
  4. 温湿度模块DHT22详解一:基础篇
  5. Github神项目推荐:深度神经网络修复打码H漫
  6. ubnt NAND flash保护策略
  7. 环形工频变压器线圈参数
  8. SSD_学习笔记记录
  9. Android BLE的总结-概念篇
  10. web scraper 入门到精通之路