Go基础学习记录 - 编写Web应用程 - 数据库(四)

栏目: 数据库 · 发布时间: 7年前

内容简介:本次分享下 -- PostgreSQL数据库驱动程序为了保持项目的可学习性,我这里将之前分享的代码积累了下,放在github上,想要尽快入手学习的,可以直接clone我的代码,写代码不上手,都等于白搭,光看的话,对于我来说,我是不行的,没办法学会。项目地址

本次分享下 -- PostgreSQL数据库驱动程序

为了保持项目的可学习性,我这里将之前分享的代码积累了下,放在github上,想要尽快入手学习的,可以直接clone我的代码,写代码不上手,都等于白搭,光看的话,对于我来说,我是不行的,没办法学会。

项目地址

https://github.com/durban89/wiki_blog
tag: 1.0.10

有些同学可能看不懂,怎么就只给了这些,完全不懂呀。我把使用的命令打出来,照着操作,就应该可以解决了

git clone https://github.com/durban89/wiki_blog /local/path
cd /local/path
git fetch origin
git checkout 1.0.10

这些我觉得 够清晰了。OK!

继续分享"数据库"的分享。

数据库

对于Web开发人员而言,数据库是Web开发的核心。

您几乎可以将任何内容保存到数据库中,并查询或更新其中的数据,如用户信息,产品或新闻文章。

Go不提供任何数据库驱动程序,但它确实在database/sql包中定义了驱动程序接口。

我们可以基于该接口开发数据库驱动程序。首先先看下 “PostgreSQL数据库驱动程序”

PostgreSQL

PostgreSQL是一个对象关系数据库管理系统,可用于许多平台,包括Linux,FreeBSD,Solaris,Microsoft Windows和Mac OS X.它是在MIT风格的许可下发布的,因此是免费的开源软件。

它比 MySQL 大,因为它是为企业用作Oracle的替代品而设计的。

Postgresql是企业类项目的不错选择。

PostgreSQL drivers

PostgreSQL有许多可用的数据库驱动程序。以下是它们的三个例子

  1. https://github.com/lib/pq supports database/sql, written in pure Go.
  2. https://github.com/jbarham/go... supports database/sql, written in pure Go.
  3. https://github.com/lxn/go-pgsql supports database/sql, written in pure Go.

我将使用后面示例中的第一个。

Samples 实例演示

安装PostgreSQL驱动

如果本地没有安装的话,先去安装下这个包,安装命令如下

go get https://github.com/lib/pq

添加PostgreSQL驱动连接

项目目录下创建一个文件夹db,db中创建一个文件pg.go,文件内容如下

package db

import (
    "database/sql"
    "fmt"

    // Register PostgreSQL
    _ "github.com/lib/pq"
)

const (
    // DBUser 用户名
    DBUser = "root"
    // DBPassword 密码
    DBPassword = "123456"
    // DBName  库名
    DBName = "test"
)

// PostgreSQLDB Conn
var PostgreSQLDB *sql.DB

func init() {
    dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable",
        DBUser, DBPassword, DBName)
    db, err := sql.Open("postgres", dbinfo)

    PostgreSQLDB = db
    checkPostgreSQLErr(err)
}

func checkPostgreSQLErr(err error) {
    if err != nil {
        panic(err)
    }
}

由于我是初学者,一些大胆的尝试,可能存在规范上或者架构上的问题,还请多多指教。

我这里之所以这样建立,本着代码分离的原则,不希望在每个使用数据库的地方都重复写一边代码,这里会不会存在重复创建连接,导致内存崩溃还有待继续深入学习。

好了,废话不多说了,这里创建了一个PostgreSQLDBB,首先说下init这个函数的作用

init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等

也就是所每次使用PostgreSQLDB的时候都会去连接下数据库

这就说明了,每次使用PostgreSQLDB的时候,PostgreSQLDB都是一个连接了的,方便后面的调用。

创建model

由于以前都是写 PHP 的,大多数使用的也都是MVC,所以我这里在项目目录下建立了一个models文件夹,然后创建一个blog.go文件,里面的代码如下

package models

import (
    "database/sql"

    "github.com/durban89/wiki/db"
)

// Conn 连接
var Conn *sql.DB

func init() {
    // MySQL
    // Conn = db.DB
    // SQLite
    // Conn = db.SQLiteDB
    // PostgreSQL
    Conn = db.PostgreSQLDB
}

// Query 获取一条数据
func Query() ([]string, error) {
    rows, err := Conn.Query("SELECT * FROM blog")

    if err != nil {
        return nil, err
    }

    var res = []string{}

    for rows.Next() {
        var autokid int
        var title string
        err = rows.Scan(&autokid, &title)

        if err != nil {
            return nil, err
        }
        res = append(res, title)
    }

    return res, nil
}

数据库创建

创建数据库blog

CREATE TABLE blog (
    autokid SERIAL PRIMARY KEY,
    title VARCHAR(100)
);

添加测试数据

INSERT INTO blog(title) VALUES('title1');
INSERT INTO blog(title) VALUES('title2');
INSERT INTO blog(title) VALUES('title3');

单元测试

下面创建测试单元,测试下我们的Query函数是否能获取到数据,创建blog_test.go文件(如果不存在),跟blog.go文件放在一起,代码内容如下

package models

import (
    "testing"
)

// TestQuery 测试获取数据
func TestQuery(t *testing.T) {
    row, err := Query()

    if err != nil {
        t.Error(err)
    } else {
        t.Log(row)
    }

    if len(row) > 0 {
        t.Log("正确")

    }

    for i, k := range row {
        t.Log(i)
        t.Log(k)
    }
}

当我们在models目录下进行测试的时候,会得到如下输出,说明我们的功能是正常的

$ go test
PASS
ok      github.com/durban89/wiki/models 0.023s

请注意,PostgreSQL使用$1,$2格式而不是MySQL使用的?,它在sql.Open中有不同的DSN格式。另一件事是PostgreSQL驱动程序不支持sql.Result.LastInsertId()。所以不是这样,

// Create 添加一条记录
func Create(title string) {
    var lastInsertID int
    err := PostgreSQLDB.QueryRow("INSERT INTO blog(title) VALUES($1) returning autokid;", title).Scan(&lastInsertID)
    checkPostgreSQLErr(err)
    fmt.Println("last inserted id =", lastInsertID)
}

使用db.QueryRow()和.Scan()来获取最后插入的id的值。

今天就分享到这里,如果你有其他疑问请在下方留言或者加群交流

项目更新地址

https://github.com/durban89/typescript_demo.git
tag: 1.0.11

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

释放潜能:平台型组织的进化路线图

释放潜能:平台型组织的进化路线图

穆胜 / 人民邮电出版社 / 2017-12 / 59.80元

传统的组织模式中,企业逃不出“员工动不起来”和“创新乏力”的宿命。互联网改变商业逻辑的同时也改变了组织逻辑。平台型组织是匹配互联网商业逻辑的组织模式,它赋予了基层员工更多的责权利,能够在需求侧灵敏获取用户刚需、在供给侧灵活整合各类资源、用“分好钱”的机制激活个体去整合各类资源满足用户刚需,形 成供需之间的高效连接。 打造平台型组织有两大主题:一是通过设计精巧的激励机制让每个人都能感受到市场的压力,......一起来看看 《释放潜能:平台型组织的进化路线图》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具