golang基础-Postgresql使用、Go中使用PostgreSQL(github.com/lib/pq学习)
文章目录
- 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学习)相关推荐
- psql+加载mysql数据库_Go实战--go语言操作PostgreSQL数据库(github.com/lib/pq)
生命不止,继续 Go go go !!! 之前关于golang操作数据库的博客: 今天跟大家分享golang中使用PostgreSQL数据库. 何为PostgreSQL PostgreSQL is a ...
- pq和mysql_Go实战--go语言操作PostgreSQL数据库(github.com/lib/pq)
生命不止,继续 Go go go !!! 之前关于golang操作数据库的博客: 今天跟大家分享golang中使用PostgreSQL数据库. 何为PostgreSQL PostgreSQL is a ...
- php框架 postgresql,CodeIgniter框架中使用PostgreSQL的配置
近日,因参与PostgresQL中国开源网站的建设,使用了CodeIgniter这个PHP的框架,相对还是算简单的,不过其文档中只给了使用mysql数据库的配置,而我们需使用PostgreSQL,特此 ...
- Spring Boot中使用PostgreSQL数据库
在如今的关系型数据库中,有两个开源产品是你必须知道的.其中一个是MySQL,相信关注我的小伙伴们一定都不陌生,因为之前的Spring Boot关于关系型数据库的所有例子都是对MySQL来介绍的.而今天 ...
- 设计时数据源:在PostgreSql 数据查询中使用参数过滤
在上一篇文章中,我们学习了如何设计时连接PostgreSQL 数据库及环境搭建.本节我们来学习使用PostgreSql 数据源时,创建数据集时带参数过滤的查询语句写法. 在报表中包含两种参数,可参考博 ...
- 在scala中访问postgresql(使用sbt)
默认已经安装了scala和SBT,并且对sbt有基本了解,知道怎样用sbt建立一个工程. 添加依赖 要在scala中使用postgresql数据库,需要导入postgresql驱动相关的库文件,pos ...
- pg_restore - 从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。
SYNOPSIS pg_restore [ option...] [ filename] DESCRIPTION 描述 pg_restore 是一种用于恢复由 pg_dump(1) 创建的任何非纯文本 ...
- 用PostgreSQL运行文件中的SQL程序
用PostgreSQL运行文件中的SQL程序 首先文件内容如下: $ ls barcode.sql drop_tables.sql orderline.sql create_tables-bpsimp ...
- postgresql 锁_PostgreSQL中的锁:3.其他锁
postgresql 锁 object-level locks (specifically, relation-level locks), as well as 对象级别的锁 (特别是关系级别的锁), ...
最新文章
- Java项目:网盘系统设计和实现(java+ssm+jpa)
- Java并发编程--6.Exchanger线程间交换数据
- linux 删除o开头的文件,linux实现除了某个文件或某个文件夹以外的全部删除
- python读取连接数据库文件_python 读取配置文件 pandas连接数据库
- ajax点击更改div,jquery ajax双击div可直接修改div中的内容
- [转]【JAVA各版本特性】JAVA 1.0
- Python使用pyzabbix调用Zabbix API
- tomcat启动之后,Chrome浏览器可以访问,IE不行(IE无法访问8080 端口)
- IDF 实验室 初探乾坤
- [转载] python中断响应_用Python脚本监测.py脚本的进程状态,并实现中断重启。
- Unity3D AssetBundle相关
- ktv收银管理系统服务器,ktv收银管理系统.pdf
- matlab有限差分法编程波导_有限差分法及matlab实现.pdf
- 天翼1号2021修改IMEI教程
- VMDK(VMWare Virtual Machine Disk Format)是虚拟机VMware创建的虚拟硬盘格式
- php如何截取出视频中的指定帧作为图片
- MySQL数据库选择题
- 吊打 CLIP 平均10个点,Meta 多模态通用模型 FLAVA真香啊
- PYTHON代码:根据FileRecord和MAP的关系,拼接IBM V7000 精简卷碎片
- Android 程序员必须掌握的三种自动化测试方法