cpp

MySQL. Получение информации о таблице

Получить информацию о таблице позволяют следующие методы структуры sql.Rows, объект которой возвращает метод Query():

  • Columns() — позволяет получить слайс с названиями полей. Формат метода:
(*sql.Rows).Columns() ([]string, error)

Пример:

fmt.Println(rows.Columns()) // [id_rubr name_rubr] <nil>
  • ColumnTypes() — позволяет получить слайс информацией о полях. Формат метода:
(*sql.Rows).ColumnTypes() ([]*sql.ColumnType, error)

Пример вывода названий полей:

arr, err := rows.ColumnTypes()
if err != nil {
   fmt.Fprintln(os.Stderr, err)
   return
}
for _, v := range arr {
   fmt.Println(v.Name())
}

Структура sql.ColumnType содержит следующие методы:

  • Name() — возвращает название поля или псевдоним. Формат метода:
(*sql.ColumnType).Name() string
  • DatabaseTypeName() — возвращает тип данных поля. Формат метода:
(*sql.ColumnType).DatabaseTypeName() string
  • ScanType() — возвращает тип данных Go, подходящий для сканирования с помощью метода Scan(). Формат метода:
(*sql.ColumnType).ScanType() reflect.Type
  • Nullable() — через первое возвращаемое значение доступно true, если поле может содержать NULL, и false — в противном случае. Через второе возвращаемое значение доступно true, если драйвер поддерживает это свойство, и false — в противном случае. Формат метода:
(*sql.ColumnType).Nullable() (nullable bool, ok bool)
  • Length() — через первое возвращаемое значение доступна длина поля переменной длины. Через второе возвращаемое значение доступно true, если драйвер поддерживает это свойство, и false — в противном случае. Формат метода:
(*sql.ColumnType).Length() (length int64, ok bool)
  • DecimalSize() — через первое возвращаемое значение доступна точность, а через второе — масштаб десятичного типа. Через третье возвращаемое значение доступно true, если драйвер поддерживает это свойство, и false — в противном случае. Формат метода:
(*sql.ColumnType).DecimalSize() (precision int64,
                                 scale int64, ok bool)

Пример получения информации о таблице site приведен в листинге 16.9.

Листинг 16.9. Получение информации о таблице

package main

import (
   "database/sql"
   "fmt"
   "os"

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

func main() {
   db, err := sql.Open("mysql", "root:@/godb")
   if err != nil {
      fmt.Fprintln(os.Stderr, err)
      return
   }
   defer db.Close()
   rows, err := db.Query("SELECT * FROM `site`")
   if err != nil {
      fmt.Fprintln(os.Stderr, err)
      return
   }
   defer rows.Close()
   fmt.Println(rows.Columns())
   arr, err := rows.ColumnTypes()
   if err != nil {
      fmt.Fprintln(os.Stderr, err)
      return
   }
   for _, v := range arr {
      fmt.Println(v.Name())
      fmt.Println("---", v.DatabaseTypeName())
      fmt.Println("---", v.ScanType())
      fmt.Print("--- Nullable() ")
      fmt.Println(v.Nullable())
      fmt.Print("--- Length() ")
      fmt.Println(v.Length())
      fmt.Print("--- DecimalSize() ")
      fmt.Println(v.DecimalSize())
   }
}

Результат:

C:\book\packages>go run main.go
[id_site id_user id_rubr url title msg iq] <nil>
id_site
--- MEDIUMINT
--- int32
--- Nullable() false true
--- Length() 0 false
--- DecimalSize() 0 0 false
id_user
--- MEDIUMINT
--- sql.NullInt64
--- Nullable() true true
--- Length() 0 false
--- DecimalSize() 0 0 false
id_rubr
--- MEDIUMINT
--- sql.NullInt64
--- Nullable() true true
--- Length() 0 false
--- DecimalSize() 0 0 false
url
--- CHAR
--- sql.RawBytes
--- Nullable() true true
--- Length() 0 false
--- DecimalSize() 0 0 false
title
--- CHAR
--- sql.RawBytes
--- Nullable() true true
--- Length() 0 false
--- DecimalSize() 0 0 false
msg
--- TEXT
--- sql.RawBytes
--- Nullable() true true
--- Length() 0 false
--- DecimalSize() 0 0 false
iq
--- TINYINT
--- sql.NullInt64
--- Nullable() true true
--- Length() 0 false
--- DecimalSize() 0 0 false

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Реквизиты

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp