Golang连接并操作PostgreSQL数据库基本操作

目录
  • 前言:
  • 连接数据库
    • sql.DB
  • 增删改查
    • 插入数据
    • 更新数据
    • 查询数据
    • 删除数据
  • 总结

前言:

本篇文章对如何使用golang连接并操作postgre数据库进行了简要说明。文中使用到的主要工具:DBeaver21、VSCode,Golang1.17。

以用户,文章,评论三个表作为例子,下面是数据库建表sql:

CREATE TABLE public.user_info (
    u_id serial4 NOT NULL,
    user_name varchar NULL,
    create_time date NULL,
    CONSTRAINT user_info_pk PRIMARY KEY (u_id)
);
CREATE TABLE public.user_info (
    u_id serial4 NOT NULL,
    user_name varchar NULL,
    create_time date NULL,
    CONSTRAINT user_info_pk PRIMARY KEY (u_id)
);
CREATE TABLE public."comment" (
    c_id serial4 NOT NULL,
    "content" varchar NULL,
    CONSTRAINT comment_pk PRIMARY KEY (c_id)
);

连接数据库

连接postgre数据库的驱动有很多,我们选用了github.com/lib/pq。下面看连接的方法。我们引入pq包时使用了_进行匿名加载,而不是直接使用驱动包。在对数据库的操作仍然是使用自带的sql包。另外,postgre默认使用的是public模式(schema),我们创建的表也是在这个模式下的。可以直接在数据库中修改默认模式或者在连接url中添加currentSchema=myschema来指定默认的模式,当然也可以在sql中使用myschema.TABLE来指定要访问的模式。

package main

import (
    "database/sql"
    "fmt"

    _ "github.com/lib/pq"
)

var db *sql.DB

func DbOpen() {
    var err error
    //参数根据自己的数据库进行修改
    db, err = sql.Open("postgres", "host=localhost port=5432 user=angelhand password=2222 dbname=ahdb sslmode=disable")
    checkError(err)
    err = db.Ping()
    checkError(err)
}

sql.DB

需要注意的是,sql.DB并不是数据库连接,而是一个go中的一个数据结构:

type DB struct {
    // Atomic access only. At top of struct to prevent mis-alignment
    // on 32-bit platforms. Of type time.Duration.
    waitDuration int64 // Total time waited for new connections.

    connector driver.Connector
    // numClosed is an atomic counter which represents a total number of
    // closed connections. Stmt.openStmt checks it before cleaning closed
    // connections in Stmt.css.
    numClosed uint64

    mu           sync.Mutex // protects following fields
    freeConn     []*driverConn
    connRequests map[uint64]chan connRequest
    nextRequest  uint64 // Next key to use in connRequests.
    numOpen      int    // number of opened and pending open connections
    // Used to signal the need for new connections
    // a goroutine running connectionOpener() reads on this chan and
    // maybeOpenNewConnections sends on the chan (one send per needed connection)
    // It is closed during db.Close(). The close tells the connectionOpener
    // goroutine to exit.
    openerCh          chan struct{}
    closed            bool
    dep               map[finalCloser]depSet
    lastPut           map[*driverConn]string // stacktrace of last conn's put; debug only
    maxIdleCount      int                    // zero means defaultMaxIdleConns; negative means 0
    maxOpen           int                    // <= 0 means unlimited
    maxLifetime       time.Duration          // maximum amount of time a connection may be reused
    maxIdleTime       time.Duration          // maximum amount of time a connection may be idle before being closed
    cleanerCh         chan struct{}
    waitCount         int64 // Total number of connections waited for.
    maxIdleClosed     int64 // Total number of connections closed due to idle count.
    maxIdleTimeClosed int64 // Total number of connections closed due to idle time.
    maxLifetimeClosed int64 // Total number of connections closed due to max connection lifetime limit.

    stop func() // stop cancels the connection opener.
}

在拿到sql.DB时并不会创建新的连接,而可以认为是拿到了一个数据库连接池,只有在执行数据库操作(如Ping()操作)时才会自动生成一个连接并连接数据库。在连接操作执行完毕后应该及时地释放。此处说的释放是指释放连接而不是sql.DB连接,通常来说一个sql.DB应该像全局变量一样长期保存,而不要在某一个小函数中都进行Open()Close()操作,否则会引起资源耗尽的问题。

增删改查

下面代码实现对数据简单的增删改查操作。

插入数据

func insert() {
    stmt, err := db.Prepare("INSERT INTO user_info(user_name,create_time) VALUES($1,$2)")
    if err != nil {
        panic(err)
    }

    res, err := stmt.Exec("ah", time.Now())
    if err != nil {
        panic(err)
    }

    fmt.Printf("res = %d", res)
}

使用Exec()函数后会返回一个sql.Result即上面的res变量接收到的返回值,它提供了LastInserId() (int64, error)RowsAffected() (int64, error)分别获取执行语句返回的对应的id和语句执行所影响的行数。

更新数据

func update() {
    stmt, err := db.Prepare("update user_info set user_name=$1 WHERE u_id=$2")
    if err != nil {
        panic(err)
    }
    res, err := stmt.Exec("angelhand", 1)
    if err != nil {
        panic(err)
    }

    fmt.Printf("res = %d", res)
}

查询数据

结构体如下:

type u struct {
    id          int
    user_name   string
    create_time time.Time
}

接下来是查询的代码

func query() {
    rows, err := db.Query("select u_id, user_name, create_time from user_info where user_name=$1", "ah")
    if err != nil {
        panic(err)

    }
    //延迟关闭rows
    defer rows.Close()

    for rows.Next() {
        user := u{}
        err := rows.Scan(&user.id, &user.user_name, &user.create_time)
        if err != nil {
            panic(err)
        }
        fmt.Printf("id = %v, name = %v, time = %v\n", user.id, user.user_name, user.create_time)
    }
}

可以看到使用到的几个关键函数rows.Close()rows.Next()rows.Scan()。其中rows.Next()用来遍历从数据库中获取到的结果集,随用用rows.Scan()来将每一列结果赋给我们的结构体。

需要强调的是rows.Close()。每一个打开的rows都会占用系统资源,如果不能及时的释放那么会耗尽系统资源。defer语句类似于java中的finally,功能就是在函数结束前执行后边的语句。换句话说,在函数结束前不会执行后边的语句,因此在耗时长的函数中不建议使用这种方式释放rows连接。如果要在循环中重发查询和使用结果集,那么应该在处理完结果后显式调用rows.Close()

db.Query()实际上等于创建db.Prepare(),执行并关闭之三步操作。

还可以这样来查询单条记录:

err := db.Query("select u_id, user_name, create_time from user_info where user_name=$1", "ah").Scan(&user.user_name)

删除数据

func delete() {
    stmt, err := db.Prepare("delete from user_info where user_name=$1")
    if err != nil {
        panic(err)
    }
    res, err := stmt.Exec("angelhand")
    if err != nil {
        panic(err)
    }

    fmt.Printf("res = %d", res)
}

总结

到此这篇关于Golang连接并操作PostgreSQL数据库基本操作的文章就介绍到这了,更多相关Golang连接操作PostgreSQL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在golang xorm中使用postgresql的json,array类型的操作

    xorm支持各种关系数据库,最近使用postgresql时,总是踩到一些坑,在此记录下解决方式. 在使用postgresql的array类型时,查询有点问题,xorm的官方文档给出重写的方式,但是不是很清晰: 官方文档链接:http://xorm.io/docs 也就是说碰到基础库不支持的类型,需要我们去重写ToDB.FromDB方法,废话不多说直接上代码: 比如int8[]类型,自定一个Int64Array type Int64Array []int64 func (s *Int64Array

  • go语言 xorm框架 postgresql 的用法及详细注解

    xorm用于在golang中链接数据库,并完成增删改差操作,不管是orm还是raw方式都十分的新颖简单. sql语句 postgresql pgadmin /*表结构*/ CREATE TABLE public.user ( id serial primary key, name varchar(20) ); ALTER TABLE public.user ADD COLUMN created timestamp default now(); ALTER TABLE public.user AD

  • Golang连接并操作PostgreSQL数据库基本操作

    目录 前言: 连接数据库 sql.DB 增删改查 插入数据 更新数据 查询数据 删除数据 总结 前言: 本篇文章对如何使用golang连接并操作postgre数据库进行了简要说明.文中使用到的主要工具:DBeaver21.VSCode,Golang1.17. 以用户,文章,评论三个表作为例子,下面是数据库建表sql: CREATE TABLE public.user_info ( u_id serial4 NOT NULL, user_name varchar NULL, create_time

  • php连接与操作PostgreSQL数据库的方法

    本文实例讲述了php连接与操作PostgreSQL数据库的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: $pg=@pg_connect("host=localhost user=postgres password=sa dbname=employes") or die("can't connect to database."); $query="select * from employes order by serial_no&q

  • PHP连接及操作PostgreSQL数据库的方法详解

    本文实例讲述了PHP连接及操作PostgreSQL数据库的方法.分享给大家供大家参考,具体如下: PostgreSQL扩展在默认情况下在最新版本的PHP 5.3.x中是启用的. 可以在编译时使用--without-pgsql来禁用它.仍然可以使用yum命令来安装PHP-PostgreSQL接口: yum install php-pgsql 在开始使用PHP连接PostgreSQL接口之前,请先在PostgreSQL安装目录中找到pg_hba.conf文件,并添加以下行: # IPv4 local

  • Qt5连接并操作PostgreSQL数据库的实现示例

    教你如何查看官方demo 1. 浏览器搜索Qt,打开第一个连接. 2. 鼠标悬浮Learning,点击下边的Documentation进入文档说明. 3. 找到Qt 5,点击进入. 4. 往下拉,找到Qt SQL,点击进入. 5. 点击进入SQL Programming.也可拉到下边,点击进入SQL Examples查看官方例子. 随便点击一个例子,进入查看 6. 进入数据库使用说明位置. 7. 此时地址栏显示是qt6,如果你使用的是qt5,可以将6改成5,目前不确定6跟5有什么区别. 到此这篇

  • Python 操作 PostgreSQL 数据库示例【连接、增删改查等】

    本文实例讲述了Python 操作 PostgreSQL 数据库.分享给大家供大家参考,具体如下: 我使用的是 Python 3.7.0 PostgreSQL可以使用psycopg2模块与Python集成. sycopg2是用于Python编程语言的PostgreSQL数据库适配器. psycopg2是非常小,快速,稳定的. 您不需要单独安装此模块,因为默认情况下它会随着Python 2.5.x版本一起发布. pip3 install python-psycopg2 pip3 install ps

  • Python操作PostgreSql数据库的方法(基本的增删改查)

    Python操作PostgreSql数据库(基本的增删改查) 操作数据库最快的方式当然是直接用使用SQL语言直接对数据库进行操作,但是偶尔我们也会碰到在代码中操作数据库的情况,我们可能用ORM类的库对数控库进行操作,但是当需要操作大量的数据时,ORM的数据显的太慢了.在python中,遇到这样的情况,我推荐使用psycopg2操作postgresql数据库 psycopg2 官方文档传送门: http://initd.org/psycopg/docs/index.html 简单的增删改查 连接

  • Python连接Postgres/Mysql/Mongo数据库基本操作大全

    目录 1.连接PG库 2.连接MySQL 2.1 连接数据库 2.2 创建数据库和表 2.3 插入数据 2.4 数据库查询操作 2.5 数据库更新操作 2.6 删除数据操作 3.连接Mongo库 3.1 判读库是否存在 3.2 创建集合(表) 3.3 插入集合 3.4 返回 _id 字段 3.5 插入多个文档 3.6 插入指定 _id 的多个文档 3.7 查询一条数据 3.8 查询集合中所有数据 3.9 查询指定字段的数据 3.10 根据指定条件查询 3.11 高级查询 3.12 使用正则表达式

  • C# 操作PostgreSQL 数据库的示例代码

    什么是PostgreSQL? PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS). 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们. PostgreSQL(也称为Post-gress-Q-L)由PostgreSQL全球开发集团(全球志愿者团队)开发. 它不受任何公司或其他私人实体控制. 它是开源的,其源代码是免费提供的. PostgreSQL是跨平台的,可以在许多操作系统上运行,如Linux,FreeBSD,OS X,Solaris和Microsoft

  • python连接、操作mongodb数据库的方法实例详解

    本文实例讲述了python连接.操作mongodb数据库的方法.分享给大家供大家参考,具体如下: 数据库连接 from pymongo import MongoClient import pandas as pd #建立MongoDB数据库连接 client = MongoClient('162.23.167.36',27101)#或MongoClient("mongodb://162.23.167.36:27101/") #连接所需数据库,testDatabase为数据库名: db=

  • VB语言使用ADO连接、操作SQLServer数据库教程

    几年前学过的VB几乎忘光了,这几天复习了下.VB连接ADO数据库并不是非常难. 连接第一步(要仔细看) 对于小白来讲,这里的教程最详细,连接ADO数据库第一步,要添加什么部件呢?全称是Microsoft ADO Data Control 6.0 (SP6) (OLEDB) 部件. 在Microsoft ADO Data Control 6.0 (SP6) (OLEDB)部件里有一个名叫:Adodc数据控件,要将它添加.在Adodc数据控件数据位置中找到ACCES. 控件引用的方法(值指的是姓名)

随机推荐