/iotmaker.db.mssql.util

Primary LanguageGoApache License 2.0Apache-2.0

iotmaker.db.mssql.util

Esse pacote golang tem por finalidade ajudar a exportar dados contidos em banco de dados MS SQL Server e foi idealizado para ajudar na criação de códigos Golang.

Basicamente, basta apontar uma tabela e o código vai escrever o código básico para a acessar e exportar a tabela linha a linha em forma de um struct populado.

Veja um exemplo abaixo:

USE [toExport]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[work_phone](
    [id] [bigint] NOT NULL,
    [number] [nchar](20) NULL,
    CONSTRAINT [PK_work_phone] PRIMARY KEY CLUSTERED
       (
        [id] ASC
           )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[home_phone](
	[id] [bigint] NOT NULL,
	[number] [nchar](20) NULL,
 CONSTRAINT [PK_home_phone] PRIMARY KEY CLUSTERED
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[mobile_phone](
     [id] [bigint] NOT NULL,
     [number] [nchar](20) NULL,
     CONSTRAINT [PK_mobile_phone] PRIMARY KEY CLUSTERED
         (
          [id] ASC
             )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[user](
     [id] [bigint] NOT NULL,
     [id_mobile_phone] [bigint] NULL,
     [id_home_phone] [bigint] NULL,
     [id_work_phone] [bigint] NULL,
     [name] [nchar](255) NULL,
     CONSTRAINT [PK_user] PRIMARY KEY CLUSTERED
         (
          [id] ASC
             )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[user]  WITH CHECK ADD  CONSTRAINT [FK_user_home_phone] FOREIGN KEY([id_home_phone])
    REFERENCES [dbo].[home_phone] ([id])
GO

ALTER TABLE [dbo].[user] CHECK CONSTRAINT [FK_user_home_phone]
GO

ALTER TABLE [dbo].[user]  WITH CHECK ADD  CONSTRAINT [FK_user_mobile_phone] FOREIGN KEY([id_mobile_phone])
    REFERENCES [dbo].[mobile_phone] ([id])
GO

ALTER TABLE [dbo].[user] CHECK CONSTRAINT [FK_user_mobile_phone]
GO

ALTER TABLE [dbo].[user]  WITH CHECK ADD  CONSTRAINT [FK_user_work_phone] FOREIGN KEY([id_work_phone])
    REFERENCES [dbo].[work_phone] ([id])
GO

ALTER TABLE [dbo].[user] CHECK CONSTRAINT [FK_user_work_phone]
GO

INSERT INTO [dbo].[home_phone]([id],[number])VALUES(1,'home 1')
GO
INSERT INTO [dbo].[home_phone]([id],[number])VALUES(2,'home 2')
GO
INSERT INTO [dbo].[home_phone]([id],[number])VALUES(3,'home 3')
GO


INSERT INTO [dbo].[mobile_phone]([id],[number])VALUES(1,'mobile 1')
GO
INSERT INTO [dbo].[mobile_phone]([id],[number])VALUES(2,'mobile 2')
GO
INSERT INTO [dbo].[mobile_phone]([id],[number])VALUES(3,'mobile 3')
GO


INSERT INTO [dbo].[work_phone]([id],[number])VALUES(1,'work 1')
GO
INSERT INTO [dbo].[work_phone]([id],[number])VALUES(2,'work 2')
GO
INSERT INTO [dbo].[work_phone]([id],[number])VALUES(3,'work 3')
GO

INSERT INTO [dbo].[user]([id],[id_mobile_phone],[id_home_phone],[id_work_phone],[name])VALUES(1,1,1,1,'home 1; phone 1; work 1')
INSERT INTO [dbo].[user]([id],[id_mobile_phone],[id_home_phone],[id_work_phone],[name])VALUES(2,2,2,2,'home 2; phone 2; work 2')
INSERT INTO [dbo].[user]([id],[id_mobile_phone],[id_home_phone],[id_work_phone],[name])VALUES(3,3,3,3,'home 3; phone 3; work 3')
GO
package main

import (
	"context"
	"database/sql"
	"fmt"
	_ "github.com/denisenkom/go-mssqldb"
	mssqlUtil "github.com/helmutkemper/iotmaker.db.mssql.util"
)

var (
	ctx context.Context
)

func main() {
	var err error
	var db *sql.DB

	ctx = context.Background()

	connString := fmt.Sprintf("server=%s;port=%d;database=%s;user id=%s;password=%s",
		"localhost",
		1434,
		"toExport",
		"____user_name____",
		"____password____",
  )
	db, err = sql.Open("sqlserver", connString)
	if err != nil {
		panic(err)
	}
	err = db.PingContext(ctx)
	if err != nil {
		panic(err)
	}

	defer db.Close()

	var tbl mssqlUtil.Database
	tbl.New(db, ctx)
	fmt.Printf("%v", tbl.ToCode("user", "main"))
}

Saída:

package main

import (
	"context"
	"database/sql"
	"fmt"
	_ "github.com/denisenkom/go-mssqldb"
)

func main() {
	var err error
	var db *sql.DB
	var ctx context.Context

	ctx = context.Background()

	connString := fmt.Sprintf("server=%s;port=%d;database=%s;user id=%s;password=%s",
		"localhost",
		1434,
		"toExport",
		"CS\\helmut.kemper",
		"temp@123",
	)

	db, err = sql.Open("sqlserver", connString)
	if err != nil {
		panic(err)
	}
	err = db.PingContext(ctx)
	if err != nil {
		panic(err)
	}
	err = GetUser(db, ctx)
	if err != nil {
		panic(err)
	}
}

func YourFunction(data interface{}) {
	fmt.Printf("%+v", data)
}

type DataUser struct {
	Id          int64
	HomePhone   []DataHomePhone
	MobilePhone []DataMobilePhone
	WorkPhone   []DataWorkPhone
	Name        string
}

type DataMobilePhone struct {
	Id     int64
	Number string
}

type DataHomePhone struct {
	Id     int64
	Number string
}

type DataWorkPhone struct {
	Id     int64
	Number string
}

type TableMobilePhone struct {
	Id     int64
	Number string
}

type TableHomePhone struct {
	Id     int64
	Number string
}

type TableWorkPhone struct {
	Id     int64
	Number string
}

type TableUser struct {
	Id            int64
	IdHomePhone   int64
	IdMobilePhone int64
	IdWorkPhone   int64
	Name          string
}

func GetUser(db *sql.DB, ctx context.Context) error {
	var err error
	var RowUser *sql.Rows
	RowUser, err = db.QueryContext(ctx, "SELECT id, id_home_phone, id_mobile_phone, id_work_phone, name FROM [user]")
	if err != nil {
		return err
	}
	if RowUser.Next() {
		var UserColumnId int64
		var UserColumnIdHomePhone int64
		var UserColumnIdMobilePhone int64
		var UserColumnIdWorkPhone int64
		var UserColumnName string
		err = RowUser.Scan(&UserColumnId, &UserColumnIdHomePhone, &UserColumnIdMobilePhone, &UserColumnIdWorkPhone, &UserColumnName)
		if err != nil {
			return err
		}
		var data = DataUser{
			Id:          UserColumnId,
			HomePhone:   GetHomePhoneAsArray(db, ctx, UserColumnIdHomePhone),
			MobilePhone: GetMobilePhoneAsArray(db, ctx, UserColumnIdMobilePhone),
			WorkPhone:   GetWorkPhoneAsArray(db, ctx, UserColumnIdWorkPhone),
			Name:        UserColumnName,
		}

		YourFunction(data)
	}
	return nil

}

func GetMobilePhoneAsArray(db *sql.DB, ctx context.Context, UserColumnIdMobilePhone int64) []DataMobilePhone {
	var err error
	var ArrayOfTableMobilePhone = make([]DataMobilePhone, 0)
	var RowMobilePhone *sql.Rows
	RowMobilePhone, err = db.QueryContext(ctx, fmt.Sprintf("SELECT id, number FROM [mobile_phone] WHERE Id = %v", UserColumnIdMobilePhone))
	if err != nil {
		panic(err)
	}
	defer RowMobilePhone.Close()
	if RowMobilePhone.Next() {
		var MobilePhoneColumnId int64
		var MobilePhoneColumnNumber string
		err = RowMobilePhone.Scan(&MobilePhoneColumnId, &MobilePhoneColumnNumber)
		if err != nil {
			panic(err)
		}
		var data = DataMobilePhone{
			Id:     MobilePhoneColumnId,
			Number: MobilePhoneColumnNumber,
		}

		ArrayOfTableMobilePhone = append(ArrayOfTableMobilePhone, data)
	}
	return ArrayOfTableMobilePhone
}

func GetHomePhoneAsArray(db *sql.DB, ctx context.Context, UserColumnIdHomePhone int64) []DataHomePhone {
	var err error
	var ArrayOfTableHomePhone = make([]DataHomePhone, 0)
	var RowHomePhone *sql.Rows
	RowHomePhone, err = db.QueryContext(ctx, fmt.Sprintf("SELECT id, number FROM [home_phone] WHERE Id = %v", UserColumnIdHomePhone))
	if err != nil {
		panic(err)
	}
	defer RowHomePhone.Close()
	if RowHomePhone.Next() {
		var HomePhoneColumnId int64
		var HomePhoneColumnNumber string
		err = RowHomePhone.Scan(&HomePhoneColumnId, &HomePhoneColumnNumber)
		if err != nil {
			panic(err)
		}
		var data = DataHomePhone{
			Id:     HomePhoneColumnId,
			Number: HomePhoneColumnNumber,
		}

		ArrayOfTableHomePhone = append(ArrayOfTableHomePhone, data)
	}
	return ArrayOfTableHomePhone
}

func GetWorkPhoneAsArray(db *sql.DB, ctx context.Context, UserColumnIdWorkPhone int64) []DataWorkPhone {
	var err error
	var ArrayOfTableWorkPhone = make([]DataWorkPhone, 0)
	var RowWorkPhone *sql.Rows
	RowWorkPhone, err = db.QueryContext(ctx, fmt.Sprintf("SELECT id, number FROM [work_phone] WHERE Id = %v", UserColumnIdWorkPhone))
	if err != nil {
		panic(err)
	}
	defer RowWorkPhone.Close()
	if RowWorkPhone.Next() {
		var WorkPhoneColumnId int64
		var WorkPhoneColumnNumber string
		err = RowWorkPhone.Scan(&WorkPhoneColumnId, &WorkPhoneColumnNumber)
		if err != nil {
			panic(err)
		}
		var data = DataWorkPhone{
			Id:     WorkPhoneColumnId,
			Number: WorkPhoneColumnNumber,
		}

		ArrayOfTableWorkPhone = append(ArrayOfTableWorkPhone, data)
	}
	return ArrayOfTableWorkPhone
}