Запросить все строки из таблицы Mysql и сохранить как кеш - PullRequest
1 голос
/ 30 мая 2020

У меня есть одна таблица, необходимая для зарядки в моем приложении. Я пытаюсь загрузить эту таблицу в структуру JSON и использовать ее в качестве кеша. Это мой подход:

таблица:

CREATE TABLE `lwratecarddefinition` (
  `RATECARDID` int(10) DEFAULT NULL AUTO_INCREMENT,
  `RATECARDGROUPID`   int(10)  DEFAULT NULL,
  `SERVICEID` varchar(10) DEFAULT NULL,
  `USAGETYPEID` varchar(10) DEFAULT NULL,
  `CURRENCYCODE` varchar(4) DEFAULT NULL,
  `LEDGERID` varchar(15) DEFAULT NULL,
  `PULSE` varchar(10) DEFAULT NULL,
  `SPECIALPULSE` varchar(10) DEFAULT NULL,
  `NORMALRATE` varchar(10) DEFAULT NULL,
  `OFFPEAKSET` varchar(2) DEFAULT NULL,
  `OFFPEAKRATE` varchar(10) DEFAULT NULL,
  `PEAKRATE` varchar(10) DEFAULT NULL,
  `ONDEMANDSET` varchar(2) DEFAULT NULL,
  `ONDEMANDRATE` varchar(2) DEFAULT NULL,
   KEY `idx_lwratecarddefinition_RATECARDID` (`RATECARDID`),
   KEY `idx_lwratecarddefinition_RATECARDGROUPID` (`RATECARDGROUPID`),
   KEY `idx_lwratecarddefinition_USAGETYPEID` (`USAGETYPEID`),
   KEY `idx_lwratecarddefinition_SERVICEID` (`SERVICEID`)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8

main. go фрагмент кода - (моя цель - получать записи каждые 1 минуту, используя процедуру go)

    // load the ratecard first
    lwratecardefinition = getRatecard()
    // update data every 1 second
    go func() {
        for {
            time.Sleep(time.Second)
            lwratecardefinition = getRatecard()
            fmt.Println(lwratecardefinition)
            }
    }()

dbfunction. go

package main

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

type Lwratecardefinition struct {
        Ratecardid        int    `json:"ratecardid"`
        Ratecardgroupid   int    `json:"ratecardgroupid"`
        Serviceid         int    `json:"serviceid"`
        Usagetypeid       int    `json:"usagetypeid"`
        Currencycode      int    `json:"currencycode"`
        Ledgerid          string `json:"ledgerid"`
        Pulse             int    `json:"pulse"`
        Specialpulse      int    `json:"specialpulse"`
        Normalrate        int    `json:"normalrate"`
        Offpeakset        int    `json:"offpeakset"`
        Offpeakrate       int    `json:"offpeakrate"`
        Peakrate          int    `json:"peakrate"`
        Ondemandset       int    `json:"ondemandset"`
        Ondemandrate      int    `json:"ondemandrate"`
}

var lwratecardefinition Lwratecardefinition
func getRatecard() Lwratecardefinition {
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/bcsdb")

    // if there is an error opening the connection, handle it
    if err != nil {
        panic(err.Error())
    }

    // defer the close till after the main function has finished
    // executing
    defer db.Close()

var ratecardid,ratecardgroupid,serviceid,usagetypeid,currencycode,pulse,specialpulse,normalrate,offpeakset,offpeakrate,peakrate,ondemandset,ondemandrate int
var ledgerid string

    results, err := db.Query("select ratecardid,ratecardgroupid,serviceid,usagetypeid,currencycode,ledgerid,pulse,specialpulse,normalrate,offpeakset,offpeakrate,peakrate,ondemandset,ondemandrate from lwratecarddefinition")

     if err != nil {
        panic(err.Error())
    }

    for results.Next() {
     err = results.Scan(&ratecardid,&ratecardgroupid,&serviceid,&usagetypeid,&currencycode,&ledgerid,&pulse,&specialpulse,&normalrate,&offpeakset,&offpeakrate,&peakrate,&ondemandset,&ondemandrate)

lwratecardefinition = Lwratecardefinition{Ratecardid: ratecardid, Ratecardgroupid: ratecardgroupid, Serviceid: serviceid, Usagetypeid: usagetypeid, Currencycode: currencycode, Ledgerid: ledgerid, Pulse: pulse, Specialpulse: specialpulse, Normalrate: normalrate, Offpeakset: offpeakset, Offpeakrate: offpeakrate, Peakrate: peakrate, Ondemandset: ondemandset, Ondemandrate: ondemandrate}

}
return lwratecardefinition
}

Но когда я запускаю программу, я получаю только одну строку, а не все строки из таблицы mysql. Мне нужны все строки, чтобы использовать его в качестве кеша. output:

{4 508 1 201 1 DATA 60 30 2 1 3 1 1 5}

Также моя конечная цель - использовать эти значения для нахождения скорости и пульса. Если Ratecardgroupid = X value и Serviceid = Y value, я хочу использовать значение пульса из той же строки. Пожалуйста, предложите, что здесь не так, и если подход подходит для уменьшения количества обращений к базе данных, logi c.

1 Ответ

3 голосов
/ 30 мая 2020

Но когда я выполняю программу, я получаю только одну строку, а не все строки из mysql таблицы

Поскольку ваша функция возвращает только одну Lwratecardefinition структуру, значение которой вы переопределяете на каждой итерации l oop. Вы хотите вернуть их кусочек, например:

func getRatecard() []Lwratecardefinition {
   ...
   var result []Lwratecardefinition
   for results.Next() {
     err = results.Scan(&ratecardid,&ratecardgroupid,&serviceid,&usagetypeid,&currencycode,&ledgerid,&pulse,&specialpulse,&normalrate,&offpeakset,&offpeakrate,&peakrate,&ondemandset,&ondemandrate)
     result = append(result, Lwratecardefinition{Ratecardid: ratecardid, Ratecardgroupid: ratecardgroupid, Serviceid: serviceid, Usagetypeid: usagetypeid, Currencycode: currencycode, Ledgerid: ledgerid, Pulse: pulse, Specialpulse: specialpulse, Normalrate: normalrate, Offpeakset: offpeakset, Offpeakrate: offpeakrate, Peakrate: peakrate, Ondemandset: ondemandset, Ondemandrate: ondemandrate})
   }

   if (results.Err() != nil) {
      // something went wrong while reading records
      ...
   }
   return result
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...