2013-04-17 165 views
3

最終用戶(開發或生產)請推薦一個最好使用「database/sql」包的Sql驅動程序包。我對Postgres,ODBC,MySql感興趣(可能還有其他的東西,但對於高容量 - 即不是Sqlite),可以優先在Windows和/或Linux(最好是兩者)上使用。爲了我的興趣,它可能需要最近更新/維護,並且必須使用最新的Go版本。效率(吞吐量)顯然是重要的。歡迎任何相關意見。使用sql數據庫驅動程序

+0

在一個項目中,我在過去的工作的,我們曾與Postgres的最成功進去,但我不記得我們選擇了哪一對夫婦。 – cthom06

回答

7

GO-SQL驅動程序(MySQL的):

https://github.com/Go-SQL-Driver/MySQL

樣品表:

CREATE TABLE `userinfo` (
    `uid` INT(10) NOT NULL AUTO_INCREMENT, 
    `username` VARCHAR(64) NULL DEFAULT NULL, 
    `departname` VARCHAR(64) NULL DEFAULT NULL, 
    `created` DATE NULL DEFAULT NULL, 
    PRIMARY KEY (`uid`) 
) 

CREATE TABLE `userdetail` (
    `uid` INT(10) NOT NULL DEFAULT '0', 
    `intro` TEXT NULL, 
    `profile` TEXT NULL, 
    PRIMARY KEY (`uid`) 
) 

樣品的編號:

package main 

import (
    _ "github.com/Go-SQL-Driver/MySQL" 
    "database/sql" 
    "fmt" 
) 

func main() { 
    db, err := sql.Open("mysql", "reckhou:[email protected]/test?charset=utf8") 
    checkErr(err) 

    //Insert 
    stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?") 
    checkErr(err) 

    res, err := stmt.Exec("reckhou", "IT", "2010-10-02") 
    checkErr(err) 

    id, err := res.LastInsertId() 
    checkErr(err) 

    fmt.Println(id) 

    // Update 
    stmt, err = db.Prepare("update userinfo set username=? where uid=?") 
    checkErr(err) 

    res, err = stmt.Exec("update", id) 
    checkErr(err) 

    affect, err := res.RowsAffected() 
    checkErr(err) 

    fmt.Println(affect) 

    //Query 
    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) 
    } 

    //Delete 
    stmt, err = db.Prepare("delete from userinfo where uid=?") 
    checkErr(err) 

    res, err = stmt.Exec(id) 
    checkErr(err) 

    affect, err = res.RowsAffected() 
    checkErr(err) 

    fmt.Println(affect) 

    db.Close() 

} 

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

PostgreSQ L:

https://github.com/bmizerany/pq

樣品表:

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); 

示例代碼:

import (
    "database/sql" 
    "fmt" 
    _ "github.com/bmizerany/pq" 
) 

func main() { 
    db, err := sql.Open("postgres", "user=reckhou password=reckhou dbname=test sslmode=disable") 
    checkErr(err) 

    //Insert 
    stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid") 
    checkErr(err) 

    res, err := stmt.Exec("reckhou", "IT", "2010-10-01") 
    checkErr(err) 

    id, err := res.LastInsertId() 
    checkErr(err) 

    fmt.Println(id) 

    // Update 
    stmt, err = db.Prepare("update userinfo set username=$1 where uid=$2") 
    checkErr(err) 

    res, err = stmt.Exec("update", 1) 
    checkErr(err) 

    affect, err := res.RowsAffected() 
    checkErr(err) 

    fmt.Println(affect) 

    // Query 
    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) 
    } 

    // Delete 
    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) 
    } 
} 
+0

感謝您的信息。你是否積極使用這些驅動程序,如果有的話,你的經驗是什麼?我的首選可能是使用Postgres,但是我發佈這個問題的一個原因是我在Windows上使用pq的問題。我上次下載的pq在2013年4月14日重試,並且該問題尚未解決。簡單的描述是,在連接互聯網的Windows上運行速度非常緩慢(約爲40倍),包括內置測試。隨着互聯網斷開,它可能如預期的那樣,或者至少這個因素更快。 (問題#69) –

+0

@BrianOh我現在不使用Windows,不能給你這方面的建議。我認爲這不是驅動程序的錯誤,你應該檢查你的網絡並安裝設置,或將DB移動到Linux。 –

+0

感謝您的建議。我需要使用Windows來使用我正在使用的其他軟件,並且更喜歡使用兩種軟件。我不認爲這是網絡或設置,因爲psql和其他數據庫軟件運行沒有問題,而且速度非常快。也許這是我的pq連接設置,但我不知道,也沒有人建議改變它們。 –

相關問題