[mysql] Go에서 MySQL에 연결하기 위해 권장되는 방법은 무엇입니까?

Go에서 MySQL 데이터베이스에 연결하는 안정적인 솔루션을 찾고 있습니다. 몇 가지 라이브러리를 보았지만 다른 상태의 완전성과 현재 유지 관리를 결정하는 것은 어렵습니다. 복잡한 요구 사항은 없지만 사람들이 무엇에 의존하고 있는지 또는 MySQL에 연결하는 가장 표준적인 솔루션이 무엇인지 알고 싶습니다.



답변

몇 가지 드라이버를 사용할 수 있지만 데이터베이스 / SQL API 를 구현하는 드라이버 만 다음과 같이 고려해야합니다.

  • 깨끗하고 효율적인 구문을 제공합니다.
  • 가져 오기 및 연결을 제외하고 코드를 변경하지 않고 나중에 드라이버를 변경할 수 있습니다.

MySQL에는 두 가지 빠르고 안정적인 드라이버가 제공됩니다.

나는 프로덕션 환경에서 두 가지를 모두 사용했으며 프로그램은 몇 개월 동안 수백만 개의 연결 번호로 실패없이 실행됩니다.

다른 SQL 데이터베이스 드라이버 는 go-wiki에 나열되어 있습니다 .

MyMySQL을 사용할 때 가져 오기 :

import (
    "database/sql"
    _ "github.com/ziutek/mymysql/godrv"
)

Go-MySQL-Driver 사용시 가져 오기 :

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

MyMySQL을 사용하여 연결 및 닫기 :

con, err := sql.Open("mymysql", database+"/"+user+"/"+password)
defer con.Close()
// here you can use the connection, it will be closed when function returns

Go-MySQL-Driver를 사용하여 연결 및 닫기 :

con, err := sql.Open("mysql", store.user+":"+store.password+"@/"+store.database)
defer con.Close()

하나의 행을 선택하십시오.

row := con.QueryRow("select mdpr, x, y, z from sometable where id=?", id)
cb := new(SomeThing)
err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z)

여러 행을 선택하고 결과로 배열을 작성하십시오.

rows, err := con.Query("select a, b from item where p1=? and p2=?", p1, p2)
if err != nil { /* error handling */}
items := make([]*SomeStruct, 0, 10)
var ida, idb uint
for rows.Next() {
    err = rows.Scan(&ida, &idb)
    if err != nil { /* error handling */}
    items = append(items, &SomeStruct{ida, idb})
}

삽입 :

_, err = con.Exec("insert into tbl (id, mdpr, isok) values (?, ?, 1)", id, mdpr)

MySQL로 Go에서 작업하는 것은 즐거운 경험이라는 것을 알 수 있습니다. 문제가 없었 습니다. 서버는 몇 달 동안 오류나 누수없이 실행됩니다. 대부분의 함수는 가변적 인 수의 인수를 취한다는 사실은 많은 언어에서 지루한 작업을 가볍게합니다.

나중에 다른 MySQL 드라이버를 사용해야하는 경우 하나의 go 파일에서 두 줄을 변경하면됩니다. 가져 오기를 수행하는 줄과 연결을 여는 줄입니다.


답변

select 1 row 예제를 주목할만한 몇 가지 사항 :

row := con.QueryRow("select mdpr, x, y, z from sometable where id=?",id) 
cb := new(SomeThing) 
err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z)

row.Next()이 예 에는 빠진 것이 있습니다. row.Next()반환 된 첫 번째 행을 가져 오려면를 호출해야합니다 .

또한 어떤 방식 으로든 데이터 미니멀리즘을 촉진하려는 라이브러리에는 유연성이 없습니다. 스캔되지 않은 열을 선택하려고하면 경고 만 아니라 오류가 발생합니다.


답변