Wie gehe ich mit null-Rückgabe von Werten aus einer Datenbank?

Schreibe ich ein basic-Programm zum Lesen von Werten aus Datenbank-Tabelle und drucken in der Tabelle. Der Tisch war gefüllt von einem alten Programm. Einige der Felder in der Zeile sind optional, und wenn ich versuche, Sie zu Lesen, als string, bekomme ich die folgende Fehlermeldung:

panic: sql: Scan error on column index 2: unsupported driver -> Scan pair: <nil> -> *string

Nachdem ich gelesen habe weitere Fragen zu ähnlichen Problemen, kam ich auf folgenden code zum behandeln von null-Werten. Die Methode funktioniert gut in der Praxis. Ich bekomme die Werte in Klartext und leeren string, anstatt der null-Werte.

Allerdings habe ich zwei Anliegen:

  1. Das sieht nicht so effizient. Ich muss um 25+ Felder, wie dies und das würde bedeuten, ich lese jeden von Ihnen als bytes und konvertiert zu einem string. Zu viele Funktionsaufrufe und Umbauten. Zwei Strukturen, um die Daten zu verarbeiten und so weiter...
  2. Der code hässlich aussieht. Es ist bereits auf der Suche gewundenen, mit 2 Feldern und nicht lesbar, da gehe ich auf 25+

Mache ich es falsch? Gibt es eine besser/cleaner/efficient/idiomatische golang Weg zum Lesen von Werten aus der Datenbank?

Ich finde es schwer zu glauben, dass eine moderne Sprache wie Gehen Sie würde nicht mit der Datenbank zurückgibt, anmutig.

Vielen Dank im Voraus!

Code-snippet:

//DB read format
type udInfoBytes struct {
  id                     []byte
  state                  []byte
}

//output format
type udInfo struct {
  id                     string
  state                  string
}

func CToGoString(c []byte) string {
  n := -1
  for i, b := range c {
    if b == 0 {
      break
    }
    n = i
  }
  return string(c[:n+1])
}

func dbBytesToString(in udInfoBytes) udInfo {

  var out udInfo
  var s string
  var t int

  out.id = CToGoString(in.id)
  out.state = stateName(in.state)
  return out
}

func GetInfo(ud string) udInfo {

  db := getFileHandle()
  q := fmt.Sprintf("SELECT id,state FROM Mytable WHERE id='%s' ", ud)

  rows, err := db.Query(q)
  if err != nil {
    log.Fatal(err)
  }
  defer rows.Close()
  ret := udInfo{}
  r := udInfoBytes{}
  for rows.Next() {
    err := rows.Scan(&r.id, &r.state)

    if err != nil {
      log.Println(err)
    }
    break
  }
  err = rows.Err()
  if err != nil {
    log.Fatal(err)
  }

  ret = dbBytesToString(r)
  defer db.Close()
  return ret
}

edit:

Ich will etwas, wie den folgenden, wo ich nicht haben, um sorgen über die Handhabung von NULL-und liest automatisch diese als leeren string.

//output format
type udInfo struct {
  id                     string
  state                  string
}

func GetInfo(ud string) udInfo {

  db := getFileHandle()
  q := fmt.Sprintf("SELECT id,state FROM Mytable WHERE id='%s' ", ud)

  rows, err := db.Query(q)
  if err != nil {
    log.Fatal(err)
  }
  defer rows.Close()
  r := udInfo{}

  for rows.Next() {
    err := rows.Scan(&r.id, &r.state)

    if err != nil {
      log.Println(err)
    }
    break
  }
  err = rows.Err()
  if err != nil {
    log.Fatal(err)
  }

  defer db.Close()
  return r
}
  • Danke für die Antworten. Ich sehe, dass die meisten Lösungen empfehlen die Verwendung von sql.NullString oder bestimmte Datenbank-Bibliothek. Ich wünschte, es war etwas generisch, die ausgeführt würde, auf "Datenbank/sql". Zur Zeit verwende ich den sql.NullString Lösung, wie ich eine Verbindung zu einem remote SQL Server-Datenbank über ODBC ( ich weiß, schmerzhaft).
InformationsquelleAutor FlowRaja | 2015-02-21
Schreibe einen Kommentar