2013-04-17 122 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连接设置,但我不知道,也没有人建议改变它们。 –

相关问题