Go語言庫系列之dotsql

2022-07-03 19:24:10 字數 2956 閱讀 3722

dotsql不是orm,也不是sql查詢語句的構建器,而是可以在乙個sql檔案中拎出某幾行來執行的工具,非常類似於ini配置檔案的讀取。如果還不理解,我們來看如下內容。

-- name: create-users-table

create table users (

id integer primary key autoincrement not null,

name varchar(255),

email varchar(255)

);-- name: create-user

insert into users (name, email) values(?, ?)

-- name: find-users-by-email

select id,name,email from users where email = ?

-- name: find-one-user-by-email

select id,name,email from users where email = ? limit 1

-- name: drop-users-table

drop table users

上面是sql檔案中定義的語句,我們可以很清晰地看出,每條語句上方都以-- name的方式打上了「註解」,而作為開發人員,可以根據打了標記的名稱挑選語句執行。

準備工作

目錄結構概覽

.

├── data.sql

├── go.mod

├── go.sum

└── main.go

初始化專案

go mod init dotsql
建立data.sql檔案,鍵入如下sql,只是示例,內容可以自定義。

-- name: create-users-table

drop table if exists users;

create table users (

id integer primary key autoincrement not null,

name varchar(255),

email varchar(255)

);-- name: create-user

insert into users (name, email) values(?, ?)

-- name: find-users-by-email

select id,name,email from users where email = ?

-- name: find-one-user-by-email

select id,name,email from users where email = ? limit 1

--name: drop-users-table

drop table users

為了方便,我們用sqlite來演示,並儲存在記憶體當中,所以要先安裝sqlite驅動

go get github.com/mattn/go-sqlite3
**演示

現在來寫**,匯入go-sqlite3庫

import _ "github.com/mattn/go-sqlite3"
獲取sqlite3的資料庫控制代碼

db, _ := sql.open("sqlite3", ":memory:")
載入data.sql檔案

dot, _ := dotsql.loadfromfile("data.sql")
挑選檔案中的乙個標籤來執行,exec方法的第乙個引數需要傳入控制代碼

dot.exec(db, "create-users-table")
從注釋可以找到對應的語句,是乙個建立表的操作

-- name: create-users-table

drop table if exists users;

create table users (

id integer primary key autoincrement not null,

name varchar(255),

email varchar(255)

);

再來執行第二條語句,插入表資料

dot.exec(db, "create-user", "user name", "[email protected]")
我們再來嘗試查詢表資料,這裡要注意,目前所有的操作都是基於定義的標籤來選擇執行的

rows, _ := dot.query(db, "find-users-by-email", "[email protected]")

var (

id int

name string

email string

) for rows.next()

query方法返回的是*sql.rows型別,同學們可以自行遍歷取值測試,大功告成!

我們可以先預準備sql語句,再在合適的時機執行

stmt, err := dot.prepare(db, "drop-users-table")

result, err := stmt.exec()

同樣,我們也可以將多個sql檔案合併再進行取值操作

dot1, err := dotsql.loadfromfile("queries1.sql")

dot2, err := dotsql.loadfromfile("queries2.sql")

dot := dotsql.merge(dot1, dot2)

Go語言庫系列之dotsql詳解

導讀 能單獨拎出sql檔案的某一行或幾行執行,是不是非常有趣?今天我們來介紹一下這個有意思的庫 dotsql。背景www.cppcns.com介紹 dotsql不是orm,也不是sql查詢語句的構建器,而是可以在乙個sql檔案中拎出某幾行來執行的工具,非常類似於ini配置檔案的讀取。如果還不理解,我...

Go語言庫系列之flag

終端 命令列 操作是程式設計師的必備技能,但是你知道怎麼通過golang製作出如下命令嗎?flag girl h usage of girl height int 身高 default 140 flag girl height 170 恭喜你獲得了身高 170 的女朋友整個實現非常簡單,只需要5個步...

Go語言系列之標準庫strconv

go語言中strconv包實現了基本資料型別和其字串表示的相互轉換。更多函式請檢視官方文件。這一組函式是我們平時程式設計中用的最多的。atoi atoi 函式用於將字串型別的整數轉換為int型別,函式簽名如下。func atoi s string i int,err error 如果傳入的字串引數無...