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


163

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

답변:


263

몇 가지 드라이버를 사용할 수 있지만 데이터베이스 / 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 파일에서 두 줄을 변경하면됩니다. 가져 오기를 수행하는 줄과 연결을 여는 줄입니다.


2
정말 고마워요, 한번해볼 게요. Go가 라이브러리가 구현할 수있는 데이터베이스 / SQL 패키지를 제공하는 것을 좋아합니다.
Sergi Mansilla

9
초보자를위한 훌륭한 입문서. 감사.
Rick-777

5
테스트 된 드라이버 목록 (다른 DBMS도 해당)은 code.google.com/p/go-wiki/wiki/SQLDrivers 에서 확인할 수 있습니다. 인기있는 두 번째 MySQL 드라이버 인 github.com/Go-SQL-Driver/MySQL이 있습니다. (저자 작성)
Julien Schmidt

1
@JulienSchmidt 귀하의 링크를 참조하기 위해 답변을 편집했습니다. 두 드라이버를 비교할 수있는 링크가 있다면 환영합니다.
Denys Séguret

1
@Zeynel 이것은 단지 예일뿐입니다 ( 이 개인 프로젝트 에서 발췌 ). 로 바 꾸었습니다 SomeThing. 그 줄의 요점은 중간 변수없이 쿼리 결과로 구조체를 직접 채우는 방법을 보여줍니다.
Denys Séguret

2

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()반환 된 첫 번째 행을 가져 오려면를 호출해야합니다 .

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


2
이것은 정확하지 않습니다. QueryRow 함수는 * Row를 리턴합니다. 이 함수는 쿼리가 단일 행을 반환한다고 주장합니다. Query ()는 (* Rows, error)를 반환하며, rows.Next ()를 호출해야합니다.
Alan LaMielle 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.