2013-04-17 7 views
3

Может ли конечный пользователь (разработка или производство), пожалуйста, порекомендовать пакет драйверов Sql, который предпочтительно использует пакет «database/sql». Меня интересуют Postgres, ODBC, MySql (и, возможно, что-то еще, но для большого объема, то есть не Sqlite), которые могут быть предпочтительно использованы в Windows и/или Linux (желательно оба). Чтобы быть интересным для меня, он, вероятно, должен быть недавно обновлен/сохранен и должен работать с последним релизом Go. Эффективность (пропускная способность), очевидно, важна. Любые соответствующие комментарии приветствуются.Использование драйвера базы данных sql

+0

В проекте я работал в прошлом мы имели наибольший успех с Postgres в go, но я не могу вспомнить, какой из драйверов пары мы выбрали. – cthom06

ответ

7

GO-SQL-Driver (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, чтобы повторить попытку 14 апреля 2013 года, и эта проблема не была исправлена. Краткое описание состоит в том, что в Windows, работающей с подключенным к Интернету, он работает очень медленно (коэффициент около 40), в том числе с встроенными тестами. При отключенном интернете это, вероятно, как ожидается, или, по крайней мере, этот фактор быстрее. (Проблема № 69) –

+0

@BrianOh Я не использую окна сейчас, не могу дать вам совета по этому поводу. Я думаю, что это не вина водителя, вы должны проверить свою сеть и установить настройки, или переместить DB в Linux. –

+0

Спасибо за совет. Мне нужно использовать Windows для другого программного обеспечения, которое я использую, а также предпочитаю то, что работает на обоих. Я не думаю, что это сеть или настройки, потому что psql и другое программное обеспечение базы данных работают без проблем и очень быстро. Возможно, это мои настройки соединения для pq, но я не знаю, и никто не предложил их изменить. –

Смежные вопросы