2016-12-12 5 views
-1

私はGolangの初心者であり、この言語のいくつかの概念を理解することはできません。私はそれが大好きですが、ウェブではすべての例が非常に単純で、正しい開発方法を説明していません。 これで、MySQLとのdb接続を設定したいと思います。 dbconfig.goファイルでパッケージdbconfigを作成し、interfacesファイルでパッケージdastructureを作成し、エンティティファイルで別のパッケージinitエンティティを作成します。 enter image description hereGoの別のパッケージから受信者を定義できません

main.go:

import (
    y "github.com/danyalov/shebeke/dbconfig" 
    "github.com/danyalov/shebeke/routes" 
    _ "github.com/go-sql-driver/mysql" 
    "github.com/labstack/gommon/log" 
) 

func main() { 
    db, err := y.InitDB("mysql", "root:[email protected](localhost:3306)/dbtest?parseTime=true") 
    if err != nil { 
     log.Fatal(err) 
    } 
    e := routes.NewConnection(db) 
    e.Logger.Fatal(e.Start(":9898")) 
} 

routes.go:

import (
    "github.com/danyalov/shebeke/datastructure" 
    y "github.com/danyalov/shebeke/dbconfig" 
    "github.com/labstack/echo" 
    "github.com/labstack/echo/middleware" 
) 

func NewConnection(db *y.DB) *echo.Echo { 
    e := echo.New() 
    env := Env{db} 
    e.Use(middleware.Logger()) 
    e.Use(middleware.Recover()) 

    e.GET("/contracts", env.GetContracts) 
    e.GET("/contract/:id", env.GetContractByID) 

    return e 
} 

type Env struct { 
    contract datastructure.Contract 
} 

services.go:

これは構造であります210

dbconfig.go:

import (
    "database/sql" 
    "fmt" 
    "github.com/labstack/gommon/log" 
) 

type DB struct { 
    *sql.DB 
} 

//InitDB initialize mysql database 
func InitDB(driver, path string) (*DB, error) { 
    db, err := sql.Open(driver, path) 
    if err != nil { 
     log.Fatal(err) 
    } 
    err = db.Ping() 
    if err != nil { 
     log.Fatal(err) 
    } else { 
     fmt.Println("Connected to DB") 
    } 
    return &DB{db}, err 
} 

データ構造/ contract.go:

import y "github.com/danyalov/shebeke/datastructure/entity" 

type Contract interface { 
    GetContracts() (y.Contracts, error) 
    GetContractByID(id int) (y.Contract, error) 
} 

データ構造/エンティティ/ contract.go:

import (
    "github.com/labstack/gommon/log" 
    "time" 
) 

type Contract struct { 
    ID   int  `json:"id"` 
    State  string `json:"state"` 
    StartDate time.Time `json:"start_date"` 
    FinishDate time.Time `json:"finish_date"` 
} 

type Contracts []Contract 

func (db *DB) GetContracts() (c Contracts, err error) { 
    rows, err := db.Query("select * from contract") 
    if err != nil { 
     log.Fatal(err) 
    } 

    contract := Contract{} 
    for rows.Next() { 
     err = rows.Scan(&contract.ID, &contract.State, &contract.StartDate, &contract.FinishDate) 
     c = append(c, contract) 
    } 
    return c, err 
} 

理由私はcaメソッドの受信者としてdbconfigパッケージからエンティティパッケージにDBタイプをインポートしないでください。私はUnresolved type 'DB'

このプロジェクトのmy working copy(Git)です。私はdbconfig.goをエンティティの中に入れましたが、私はそれが気に入らない、dbconfigファイルの場所が間違っていると思います。

GOでdbを構成するための正しいファイル構造は何ですか? Gitやチュートリアルで独自の例があるかもしれませんか?

+1

あなたは本当にあなたの問題を示す最小限の例を考え出すべきです。問題に関係のない複雑なコードをたくさん表示します。 – Volker

答えて

3

同じパッケージに定義されたタイプのメソッドは、でのみ定義できます。この場合のDBタイプはdbconfigパッケージ内で定義されているため、entityパッケージではメソッドを定義できません。この場合

、あなたのオプションではなく、メソッドのGetContracts機能を作成し、引数としてそれを*dbconfig.DBを手、またはdbconfigであなたのentityパッケージをインポートすることで、依存関係を反転し、方法として、(そこGetContractsを書き込んだりすることがあります機能はいずれの方法でも動作します)。デザイン上の観点からは、データベースパッケージ以外のパッケージでSQLクエリ文字列を作成する抽象化が解除されるため、実際にはこの2つ目のオプションが優れている可能性があります。

+0

したがって、GetContracts(または別のもの)をentity/contract.goからdbconfigパッケージに移動する必要がありますか? –

+1

エンティティパッケージ内にメソッド(メソッドではなく)として記述します。あなたの選択。個人的には、データベースクエリをデータベースパッケージに入れることをお勧めします。 – Kaedys

関連する問題