[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()
반환 된 첫 번째 행을 가져 오려면를 호출해야합니다 .
또한 어떤 방식 으로든 데이터 미니멀리즘을 촉진하려는 라이브러리에는 유연성이 없습니다. 스캔되지 않은 열을 선택하려고하면 경고 만 아니라 오류가 발생합니다.