pq和mysql_Go实战--go语言操作PostgreSQL数据库(github.com/lib/pq)

生命不止,继续 Go go go !!!

之前关于golang操作数据库的博客:

今天跟大家分享golang中使用PostgreSQL数据库。

0818b9ca8b590ca3270a3433284dd417.png

何为PostgreSQL

PostgreSQL is a powerful, open source object-relational database system.

PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS)。 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们。

特点

PostgreSQL可在所有主要操作系统(即Linux,UNIX(AIX,BSD,HP-UX,SGI IRIX,Mac OS X,Solaris,Tru64)和Windows等)上运行

PostgreSQL支持文本,图像,声音和视频,并包括用于C/C++,Java,Perl,Python,Ruby,Tcl和开放数据库连接(ODBC)的编程接口

PostgreSQL支持SQL的许多功能,例如复杂SQL查询,SQL子选择,外键,触发器,视图,事务,多进程并发控制(MVCC),流式复制(9.0),热备(9.0))

在PostgreSQL中,表可以设置为从“父”表继承其特征

可以安装多个扩展以向PostgreSQL添加附加功能

PostgreSQL 与 MySQL 相比,优势何在?

知乎上有大神们的讨论,可以看一看:https://www.zhihu.com/question/20010554

Windows下安装PostgreSQL

下载速度不是很快,稍安勿躁。

安装

下一步,选择安装文件夹,选择数据所在位置,填写密码,端口号,选择运行时语言环境等。

默默等待安装。

使用pgAdmin

打开pgAdmin,要输入之前设置的密码

0818b9ca8b590ca3270a3433284dd417.png

创建数据库

在Databases(1)上右键,Create, Database

0818b9ca8b590ca3270a3433284dd417.png

删除数据库

0818b9ca8b590ca3270a3433284dd417.png

创建表

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

插入数据

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

使用SQL Shell(psql)

创建数据库

create database name;

0818b9ca8b590ca3270a3433284dd417.png

删除数据库

drop database name;

如果出现错误的话,请先断开其他对该数据库的连接。

0818b9ca8b590ca3270a3433284dd417.png

创建表

CREATE TABLE public.student ( id integer, name character(1)[] COLLATE pg_catalog."default" ) WITH ( OIDS = FALSE ) TABLESPACE pg_default;

ALTER TABLE public.student OWNER to postgres;

插入数据

INSERT INTO public.teacher(

id, age)

VALUES (2,34);

查询

SELECT * FROM public.teacher;

Go中使用PostgreSQL

github.com/lib/pq

Pure Go Postgres driver for database/sql

连接

package main

import (

"database/sql"

"fmt"

_ "github.com/lib/pq"

)

const (

host = "localhost"

port =5432

user = "postgres"

password = "your_password"

dbname = "test"

)

func main() {

psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+

"password=%s dbname=%s sslmode=disable",

host, port, user, password, dbname)

db, err := sql.Open("postgres", psqlInfo)

if err != nil {

panic(err)

}

defer db.Close()

err = db.Ping()

if err != nil {

panic(err)

}

fmt.Println("Successfully connected!")

}

插入

package main

import (

"database/sql"

"fmt"

_ "github.com/lib/pq"

)

const (

host = "localhost"

port =5432

user = "postgres"

password = "wangshubo123"

dbname = "test"

)

type Teacher struct {

ID int

Age int

}

func main() {

psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+

"password=%s dbname=%s sslmode=disable",

host, port, user, password, dbname)

db, err := sql.Open("postgres", psqlInfo)

if err != nil {

panic(err)

}

defer db.Close()

err = db.Ping()

if err != nil {

panic(err)

}

fmt.Println("Successfully connected!")

sqlStatement := ` INSERT INTO teacher (id, age) VALUES ($1, $2) RETURNING id`

id :=3

err = db.QueryRow(sqlStatement,3,19).Scan(&id)

if err != nil {

panic(err)

}

fmt.Println("New record ID is:", id)

}

再运行一次,错误:panic: pq: 重复键违反唯一约束”teacher_pkey”

查询

package main

import (

"database/sql"

"fmt"

_ "github.com/lib/pq"

)

const (

host = "localhost"

port =5432

user = "postgres"

password = "wangshubo123"

dbname = "test"

)

type Teacher struct {

ID int

Age int

}

func main() {

psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+

"password=%s dbname=%s sslmode=disable",

host, port, user, password, dbname)

db, err := sql.Open("postgres", psqlInfo)

if err != nil {

panic(err)

}

defer db.Close()

err = db.Ping()

if err != nil {

panic(err)

}

fmt.Println("Successfully connected!")

sqlStatement := `SELECT * FROM teacher WHERE id=$1;`

var teacher Teacher

row := db.QueryRow(sqlStatement,1)

err = row.Scan(&teacher.ID, &teacher.Age)

switch err {

case sql.ErrNoRows:

fmt.Println("No rows were returned!")

return

case nil:

fmt.Println(teacher)

default:

panic(err)

}

}

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值