文章目录

  • postgresql介绍
  • postgresql安装使用(mac下)
  • Go中使用PostgreSQL(github.com/lib/pq学习)
    • 连接postgres
    • 查询postgres
    • 单条查询QueryRow
    • 插入
    • 修改
    • 删除

postgresql介绍

官网
https://www.postgresql.org/

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安装使用(mac下)

在Mac系统上通过通过brew into postgresql@9.6 安装数据库进行安装即可

配置环境变量

echo 'export PATH="/usr/local/opt/postgresql@9.6/bin:$PATH"' >> ~/.bash_profile

启动

pg_ctl -D /usr/local/var/postgresql\@9.6/ -l logfile start
server starting

关闭

pg_ctl -D /usr/local/var/postgresql\@9.6/ stop -s -m fast

下面先罗列一些简单的postgresql命令
创建用户

CREATE USER wyfzhiliao with password 'wyf';

创建数据库

CREATE DATABASE go OWNER wyfzhiliao;

授权

GRANT ALL PRIVILEGES ON DATABASE zldd_api TO wyfzhiliao;

系统用户登入

psql postgres

系统用户直接登入访问某个库

psql -U wyfzhiliao -d zldd_user -h 127.0.0.1

链接数据库

zldd_api=> \c zldd_user

创建表


CREATE TABLE u_order(
id      varchar(40) PRIMARY KEY  NOT NULL,
app_id           varchar(40),
mch_id           varchar(40),
nonce_str        varchar(40),
sign             varchar(40),
sign_type             varchar(40),
body             varchar(130),
out_trade_no             varchar(40),
total_fee            int,
fee_type          varchar(10) default 'CNY' ,
spbill_create_ip            varchar(20),
time_start timestamp with time zone,
time_expire timestamp with time zone,
trade_type      varchar(20),
wechat_open_id      varchar(130),
wechat_union_id      varchar(130),
wechat_pay_key      varchar(40),
user_id      varchar(40),
platform      varchar(20),
pay_courses      text[],
pay_status int
);

类型如下:


go_api=# \d u_order;Table "public.u_order"Column      |           Type           |            Modifiers
------------------+--------------------------+----------------------------------id               | character varying(40)    | not nullapp_id           | character varying(40)    | mch_id           | character varying(40)    | nonce_str        | character varying(40)    | sign             | character varying(40)    | sign_type        | character varying(40)    | body             | character varying(130)   | out_trade_no     | character varying(40)    | total_fee        | integer                  | fee_type         | character varying(10)    | default 'CNY'::character varyingspbill_create_ip | character varying(20)    | time_start       | timestamp with time zone | time_expire      | timestamp with time zone | trade_type       | character varying(20)    | wechat_open_id   | character varying(130)   | wechat_union_id  | character varying(130)   | wechat_pay_key   | character varying(40)    | user_id          | character varying(40)    | platform         | character varying(20)    | pay_courses      | text[]                   | pay_status       | integer                  |
Indexes:"u_order_pkey" PRIMARY KEY, btree (id)go_api=# \d go

列举出数据库中的表

zldd_user=> \d

列举创建的数据库

zldd_user=> \l

退出

postgres-# \q

创建表

CREATE TABLE products (product_no integer,name text,price numeric
);

删除表

drop table products;

查询表

go=> select * from products;product_no | name | price
------------+------+-------
(0 rows)

插入表

go=> INSERT INTO products VALUES (1, 'Cheese', 9.99);
INSERT 0 1
go=> select * from products;product_no |  name  | price
------------+--------+-------1 | Cheese |  9.99
(1 row)go=>

Go中使用PostgreSQL(github.com/lib/pq学习)

安装

    go get -u github.com/lib/pq

参考资料

https://godoc.org/github.com/lib/pq

连接postgres

package mainimport ("database/sql""fmt"_ "github.com/lib/pq"
)const (host     = "localhost"port     = 5432user     = "wyfzhiliao"password = "wyfzhiliao"dbname   = "go"
)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!")
}

sql.Open的第一个参数是driver名称,第二个参数是driver连接数据库的信息。DB不是连接,并且只有当需要使用时才会创建连接,如果想立即验证连接,需要用Ping()方法,如下:

You can also connect to a database using a URL. For example:

connStr := "postgres://pqgotest:password@localhost/pqgotest?sslmode=verify-full"
db, err := sql.Open("postgres", connStr)

输出如下:

另外列出出来可以使用的参数:

* dbname - The name of the database to connect to
* user - The user to sign in as
* password - The user's password
* host - The host to connect to. Values that start with / are for unixdomain sockets. (default is localhost)
* port - The port to bind to. (default is 5432)
* sslmode - Whether or not to use SSL (default is require, this is notthe default for libpq)
* fallback_application_name - An application_name to fall back to if one isn't provided.
* connect_timeout - Maximum wait for connection, in seconds. Zero ornot specified means wait indefinitely.
* sslcert - Cert file location. The file must contain PEM encoded data.
* sslkey - Key file location. The file must contain PEM encoded data.
* sslrootcert - The location of the root certificate file. The filemust contain PEM encoded data.

查询postgres

现在我的postgresql数据库中有如下一条记录

go=> select * from products where name='Proto';product_no | name  | price
------------+-------+-------2 | Proto |  9.99
(1 row)

接下来我们将它查询出来,看如下代码

package mainimport ("database/sql""fmt"_ "github.com/lib/pq"
)const (host     = "localhost"port     = 5432user     = "wyfzhiliao"password = "wyfzhiliao"dbname   = "go"
)func connectDB() *sql.DB{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)}err = db.Ping()if err != nil {panic(err)}return db
}func query(db *sql.DB){var id,name,price stringrows,err:=db.Query(" select * from products where name=$1","Proto")if err!= nil{fmt.Println(err)}defer rows.Close()for rows.Next(){err:= rows.Scan(&id,&name,&price)if err!= nil{fmt.Println(err)}}err = rows.Err()if err!= nil{fmt.Println(err)}fmt.Println(id,name,price)
}func main()  {db:=connectDB()query(db)}

输出结果如下:

2 Proto 9.99

上面代码的过程为:db.Query()表示向数据库发送一个query,defer rows.Close()非常重要(关闭连接),遍历rows使用rows.Next(),把遍历到的数据存入变量使用rows.Scan(),遍历完成后检查error。有几点需要注意:

(1) 检查遍历是否有error
(2) 结果集(rows)未关闭前,底层的连接处于繁忙状态。当遍历读到最后一条记录时,会发生一个内部EOF错误,自动调用rows.Close(),但是如果提前退出循环,rows不会关闭,连接不会回到连接池中,连接也不会关闭。所以手动关闭非常重要。rows.Close()可以多次调用,是无害操作。

单条查询QueryRow

当我们查询单条记录时候,我们可以直接用QueryRow

func query_one(db *sql.DB){var price stringerr := db.QueryRow(" select price from products where name=$1", "Proto").Scan(&price)if err != nil {if err == sql.ErrNoRows {} else {log.Fatal(err)}}fmt.Println(price)
}

输出结果如下:

9.99

插入


func insertUser(db *sql.DB)  {stmt,err := db.Prepare("insert into products(product_no,name,price) values($1,$2,$3)")if err != nil {log.Fatal(err)}_,err = stmt.Exec(6,"dump","10.88")if err != nil {log.Fatal(err)}else {fmt.Println("insert into user_tbl success")}
}

插入结果如下,我们看到数据库多了一条记录

go=> select * from products;product_no |  name  | price
------------+--------+-------1 | Cheese |  9.992 | Proto  |  9.996 | dump   | 10.88
(3 rows)

修改

func UpdateUser(db *sql.DB) {stmt,err := db.Prepare("UPDATE  products  set price=$1 WHERE  product_no=$2")if err != nil {log.Fatal(err)}_,err = stmt.Exec("11.88",6)if err != nil {log.Fatal(err)}else {fmt.Println("udpate user_tbl success")}}

更新后的数据库记录

go=> select * from products;product_no |  name  | price
------------+--------+-------1 | Cheese |  9.992 | Proto  |  9.996 | dump   | 11.88
(3 rows)

删除

func DeleteUser(db *sql.DB) {stmt,err := db.Prepare("DELETE  FROM products WHERE  product_no=$1")if err != nil {log.Fatal(err)}_,err = stmt.Exec(6)if err != nil {log.Fatal(err)}else {fmt.Println("delete form user_tbl success")}
}

删除记录后的数据库数据

go=> select * from products;product_no |  name  | price
------------+--------+-------1 | Cheese |  9.992 | Proto  |  9.99
(2 rows)go=>

golang基础-Postgresql使用、Go中使用PostgreSQL(github.com/lib/pq学习)相关推荐

  1. psql+加载mysql数据库_Go实战--go语言操作PostgreSQL数据库(github.com/lib/pq)

    生命不止,继续 Go go go !!! 之前关于golang操作数据库的博客: 今天跟大家分享golang中使用PostgreSQL数据库. 何为PostgreSQL PostgreSQL is a ...

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

    生命不止,继续 Go go go !!! 之前关于golang操作数据库的博客: 今天跟大家分享golang中使用PostgreSQL数据库. 何为PostgreSQL PostgreSQL is a ...

  3. php框架 postgresql,CodeIgniter框架中使用PostgreSQL的配置

    近日,因参与PostgresQL中国开源网站的建设,使用了CodeIgniter这个PHP的框架,相对还是算简单的,不过其文档中只给了使用mysql数据库的配置,而我们需使用PostgreSQL,特此 ...

  4. Spring Boot中使用PostgreSQL数据库

    在如今的关系型数据库中,有两个开源产品是你必须知道的.其中一个是MySQL,相信关注我的小伙伴们一定都不陌生,因为之前的Spring Boot关于关系型数据库的所有例子都是对MySQL来介绍的.而今天 ...

  5. 设计时数据源:在PostgreSql 数据查询中使用参数过滤

    在上一篇文章中,我们学习了如何设计时连接PostgreSQL 数据库及环境搭建.本节我们来学习使用PostgreSql 数据源时,创建数据集时带参数过滤的查询语句写法. 在报表中包含两种参数,可参考博 ...

  6. 在scala中访问postgresql(使用sbt)

    默认已经安装了scala和SBT,并且对sbt有基本了解,知道怎样用sbt建立一个工程. 添加依赖 要在scala中使用postgresql数据库,需要导入postgresql驱动相关的库文件,pos ...

  7. pg_restore - 从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。

    SYNOPSIS pg_restore [ option...] [ filename] DESCRIPTION 描述 pg_restore 是一种用于恢复由 pg_dump(1) 创建的任何非纯文本 ...

  8. 用PostgreSQL运行文件中的SQL程序

    用PostgreSQL运行文件中的SQL程序 首先文件内容如下: $ ls barcode.sql drop_tables.sql orderline.sql create_tables-bpsimp ...

  9. postgresql 锁_PostgreSQL中的锁:3.其他锁

    postgresql 锁 object-level locks (specifically, relation-level locks), as well as 对象级别的锁 (特别是关系级别的锁), ...

最新文章

  1. Java项目:网盘系统设计和实现(java+ssm+jpa)
  2. Java并发编程--6.Exchanger线程间交换数据
  3. linux 删除o开头的文件,linux实现除了某个文件或某个文件夹以外的全部删除
  4. python读取连接数据库文件_python 读取配置文件 pandas连接数据库
  5. ajax点击更改div,jquery ajax双击div可直接修改div中的内容
  6. [转]【JAVA各版本特性】JAVA 1.0
  7. Python使用pyzabbix调用Zabbix API
  8. tomcat启动之后,Chrome浏览器可以访问,IE不行(IE无法访问8080 端口)
  9. IDF 实验室 初探乾坤
  10. [转载] python中断响应_用Python脚本监测.py脚本的进程状态,并实现中断重启。
  11. Unity3D AssetBundle相关
  12. ktv收银管理系统服务器,ktv收银管理系统.pdf
  13. matlab有限差分法编程波导_有限差分法及matlab实现.pdf
  14. 天翼1号2021修改IMEI教程
  15. VMDK(VMWare Virtual Machine Disk Format)是虚拟机VMware创建的虚拟硬盘格式
  16. php如何截取出视频中的指定帧作为图片
  17. MySQL数据库选择题
  18. 吊打 CLIP 平均10个点,Meta 多模态通用模型 FLAVA真香啊
  19. PYTHON代码:根据FileRecord和MAP的关系,拼接IBM V7000 精简卷碎片
  20. Android 程序员必须掌握的三种自动化测试方法

热门文章

  1. 基于元路径的利用多级社会背景信息的虚假新闻检测
  2. 微服务连载(二)漫谈何时从单体架构迁移到微服务?
  3. 多光谱影像isodata非监督分类
  4. VxWorks任务挂死实战分析
  5. 郝斌老师-C语言视频教程(全180讲)
  6. JavaScript实现页面加载成功后刷新一遍当前页面(二)
  7. 选择大于努力?看涛思数据两名90后如何获得“胡润U30企业领袖奖”
  8. 推荐10款Java程序员使用的单元测试工具
  9. 王立平--poser
  10. 用python读取股票价格_我用Python分析股票价格走势,学以致用获取第一桶金!