第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

編寫(xiě)一個(gè)可以使用 2 個(gè)數(shù)據(jù)庫(kù)的應(yīng)用程序?

編寫(xiě)一個(gè)可以使用 2 個(gè)數(shù)據(jù)庫(kù)的應(yīng)用程序?

Go
胡說(shuō)叔叔 2023-07-17 14:20:28
我正在嘗試用 Go 編寫(xiě)一個(gè)應(yīng)用程序,能夠根據(jù)配置連接到 oracle 和 MySQL。我現(xiàn)在遇到的問(wèn)題是當(dāng)我使用準(zhǔn)備好的語(yǔ)句時(shí)。例如,考慮下面的查詢(xún)Select * from data_table where id = 1下面給出MySQL和oracle中對(duì)應(yīng)的prepared語(yǔ)句MySQL -> Select * from data_table where id = ? ORACLE -> Select * from data_table where id = :val1如果是這樣,我維護(hù) 2 組查詢(xún)并根據(jù)配置選擇查詢(xún)。有一個(gè)更好的方法嗎?我想避免保留兩組查詢(xún)的麻煩
查看完整描述

1 回答

?
小怪獸愛(ài)吃肉

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊

這很大程度上是通過(guò)使用接口來(lái)實(shí)現(xiàn)的。


假設(shè)您創(chuàng)建一個(gè) Web 應(yīng)用程序并且想要顯示用戶(hù)。


首先,您需要定義一個(gè)接口,例如


type Creator interface{

  Create(u User)(User,error)

}


type Reader interface{

  Read(k PrimaryKey)(User, error)

  ListAll()([]User,error)

  ListPaginated(page, offset int)([]User,error)

}


type Updater interface{

  Update(u User)(User, error)

  UpdateByKey(k PrimaryKey, u User)(User, error)

  UpdateMany(...User)error

}


type Deleter interface{

  Delete(u User)error

  DeleteMany(u ...User)error

  DeleteByKey(keys ...PrimaryKey)error

}


type CRUD interface {

  Creator

  Reader

  Updater

  Deleter

}

接下來(lái),為您想要支持的每種數(shù)據(jù)庫(kù)類(lèi)型實(shí)現(xiàn) CRUD 接口。


現(xiàn)在,您可以創(chuàng)建一個(gè)處理程序:



// ListHandler uses an interface instead of a concrete type to

// retrieve the data from the databases.

// Not only does this approach make it possible to provide different

// implementations, but it makes unit testing way easier.

//

// "Thou Shalt Write Tests"

func ListHandler(rdr Reader) http.Handler {

    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {


        // Pagination ommited for brevity


        // Note that the handler is agnostic of the underlying implementation.

        u, err := rdr.ListAll()

        if err != nil {

            log.Printf("ListHandler: error retrieving user list: %s", err)

            // Do not do this in production! It might give an attacker information

            // Use a static error message instead!

            http.Error(w, err.Error(), http.StatusInternalServerError)

            return

        }


        if err := json.NewEncoder(w).Encode(u); err != nil {

            log.Printf("ListHandler: error encoding user list to JSON: %s", err)

            // See above

            http.Error(w, err.Error(), http.StatusInternalServerError)

        }

    })

}

并設(shè)置如下:



func main() {

    // Get your config

    // Then simply use an implementation of CRUD


    var dbConn CRUD

    switch cfg.DbType {

    case "myql":

        // returns your implementation of CRUD using MySQL

        dbConn = createMySQLConnector(cfg)

    case "oracle":

        // returns your implementation of CRUD using Oracle

        dbConn = createOracleConnector(cfg)

    }


    http.Handle("/users/", ListHandler(dbConn))


    log.Fatal(http.ListenAndServe("0.0.0.0:8080", nil))

}


查看完整回答
反對(duì) 回復(fù) 2023-07-17
  • 1 回答
  • 0 關(guān)注
  • 146 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)