盡量不要使用ORM,簡(jiǎn)單的數(shù)據(jù)庫(kù)交互是會(huì)省很多事。
成都創(chuàng)新互聯(lián)公司主營(yíng)古冶網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開(kāi)發(fā),古冶h5微信平臺(tái)小程序開(kāi)發(fā)搭建,古冶網(wǎng)站營(yíng)銷(xiāo)推廣歡迎古冶等地區(qū)企業(yè)咨詢(xún)
但是一旦查詢(xún)語(yǔ)句越來(lái)越復(fù)雜,關(guān)聯(lián)表越來(lái)越多,當(dāng)你發(fā)現(xiàn)正在使用的ORM框架做不到時(shí)再換其他框架代價(jià)會(huì)很大。為什么有那么多框架?就是沒(méi)有一個(gè)框架能解決所有哪怕是大多數(shù)問(wèn)題。
建議只使用數(shù)據(jù)庫(kù)驅(qū)動(dòng)庫(kù),database/sql庫(kù),可以完成所有g(shù)o語(yǔ)言與數(shù)據(jù)庫(kù)的交互。
可以參考: windows環(huán)境下redis的安裝
啟動(dòng)redis服務(wù)器:redis-server.exe redis.windows.conf
獲取包:
導(dǎo)入包
訪(fǎng)問(wèn):
PostgreSQL和MySQL比較,它更加龐大一點(diǎn),因?yàn)樗怯脕?lái)替代Oracle而設(shè)計(jì)的。所以在企業(yè)應(yīng)用中采用PostgreSQL是一個(gè)明智的選擇。
現(xiàn)在MySQL被Oracle收購(gòu)之后,有傳聞Oracle正在逐步的封閉MySQL,,鑒于此,將來(lái)我們也許會(huì)選擇PostgreSQL而不是MySQL作為項(xiàng)目的后端數(shù)據(jù)庫(kù)。
1、驅(qū)動(dòng)
Go實(shí)現(xiàn)的支持PostgreSQL的驅(qū)動(dòng)也很多,因?yàn)閲?guó)外很多人在開(kāi)發(fā)中使用了這個(gè)數(shù)據(jù)庫(kù)。
支持database/sql驅(qū)動(dòng),純Go寫(xiě)的
支持database/sql驅(qū)動(dòng),純Go寫(xiě)的
支持database/sql驅(qū)動(dòng),純Go寫(xiě)的
在下面的示例中我采用了第一個(gè)驅(qū)動(dòng),因?yàn)樗壳笆褂玫娜俗疃?,在github上也比較活躍。
2、實(shí)例代碼
數(shù)據(jù)庫(kù)建表語(yǔ)句:
復(fù)制代碼
CREATE TABLE userinfo
(
uid serial NOT NULL,
username character varying(100) NOT NULL,
departname character varying(500) NOT NULL,
Created date,
CONSTRAINT userinfo_pkey PRIMARY KEY (uid)
)
WITH (OIDS=FALSE);
CREATE TABLE userdeatail
(
uid integer,
intro character varying(100),
profile character varying(100)
)
WITH(OIDS=FALSE);
復(fù)制代碼
看下面這個(gè)Go如何操作數(shù)據(jù)庫(kù)表數(shù)據(jù):增刪改查
復(fù)制代碼
package main
import (
"database/sql"
"fmt"
_ "github點(diǎn)抗 /bmizerany/pq"
)
func main() {
db, err := sql.Open("postgres", "user=astaxie password=astaxie dbname=test sslmode=disable")
checkErr(err)
//插入數(shù)據(jù)
stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid")
checkErr(err)
res, err := stmt.Exec("astaxie", "研發(fā)部門(mén)", "2012-12-09")
checkErr(err)
//pg不支持這個(gè)函數(shù),因?yàn)樗麤](méi)有類(lèi)似MySQL的自增ID
id, err := res.LastInsertId()
checkErr(err)
fmt.Println(id)
//更新數(shù)據(jù)
stmt, err = db.Prepare("update userinfo set username=$1 where uid=$2")
checkErr(err)
res, err = stmt.Exec("astaxieupdate", 1)
checkErr(err)
affect, err := res.RowsAffected()
checkErr(err)
fmt.Println(affect)
//查詢(xún)數(shù)據(jù)
rows, err := db.Query("SELECT * FROM userinfo")
checkErr(err)
for rows.Next() {
var uid int
var username string
var department string
var created string
err = rows.Scan(uid, username, department, created)
checkErr(err)
fmt.Println(uid)
fmt.Println(username)
fmt.Println(department)
fmt.Println(created)
}
//刪除數(shù)據(jù)
stmt, err = db.Prepare("delete from userinfo where uid=$1")
checkErr(err)
res, err = stmt.Exec(1)
checkErr(err)
affect, err = res.RowsAffected()
checkErr(err)
fmt.Println(affect)
db.Close()
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
復(fù)制代碼
從上面的代碼我們可以看到,PostgreSQL是通過(guò)$1,$2這種方式來(lái)指定要傳遞的參數(shù),而不是MySQL中的?,另外在sql.Open中的dsn信息的格式也與MySQL的驅(qū)動(dòng)中的dsn格式不一樣,所以在使用時(shí)請(qǐng)注意它們的差異。
還有pg不支持LastInsertId函數(shù),因?yàn)镻ostgreSQL內(nèi)部沒(méi)有實(shí)現(xiàn)類(lèi)似MySQL的自增ID返回,其他的代碼幾乎是一模一樣