Desenvolvimento

9 nov, 2018

NameIT + Dbatools gerando tabela com dados Fake

Publicidade

Olá, pessoal!

Hoje irei apresentar um novo módulo de PowerShell que pode ajudar nas rotinas de testes, sempre que precisamos testar alguma nova rotina, funcionalidade, script, demonstrações, ou até mesmo brincar com T-SQL. Muito desses casos precisamos gerar tabelas com dados.

Apesar de ser uma tarefa relativamente simples, em alguns momentos precisamos de dados mais próximos da realidade. Para isso utilizaremos o módulo de PowerShell NameIT criado por Doug Finke.

Esse módulo já está publicado na PSGallery, então se você está operando em uma versão do PowerShell que seja igual ou superior a 3.0, pode instalar o módulo com o seguinte script:

Install-Module NameIT

Para validar a instalação do módulo:

Get-Module -ListAvailable -Name NameIT

Esse módulo proporciona uma forma fácil para gerar dados aleatórios e com mais riqueza do que costumamos gerar manualmente. Ele engloba os seguintes valores de geração a seguir. Os dados são baseados nos Estados Unidos – ainda não há suporte para nossa língua.

  • [person]: gera nomes masculinos e femininos aleatórios
  • [person female]: gera nomes femininos aleatórios
  • [person male]: gera nomes masculinos aleatórios
  • [address]: gera endereços aleatórios
  • [state]: gera informações sobre estados
  • [randomdate]: datas aleatórias
  • [synonym word]: gera sinônimos de uma palavra
  • [numeric]: gera números
  • [alpha]: gera letras aleatórias
  • [vowel]: gera vogais aleatórias
  • [consonant]: gera consoantes aleatórias
  • [syllable]: gera sílabas aleatórias

A principal função do módulo é a Invoke-Generate:

Invoke-Generate “[person], [address]” -Count 4

No exemplo acima a chamada do comando gera quatro nomes e endereços aleatórios. O parâmetro -Count indica a quantidade de itens que será gerado.

Podemos gerar palavras com combinações de valores aleatórios, como:

Invoke-Generate “Servidor-###-???” -count 5

No exemplo acima podemos notar que o carácter “#” é traduzido como um número aleatório e o caractere“?” é traduzido como uma letra aleatória.

Sinônimos para a palavra “Discovery”:

Invoke-Generate “[synonym discovery]”

Gerando nomes aleatórios do sexo feminino:

Invoke-Generate “[person female]” -5

Gerando dados sobre estados como abreviação, código postal e capital.

Invoke-Generate “[state abbr] [state zip] [state capital]” -5

Você pode customizar seus próprios conjuntos de dados para casos mais específicos. Exemplo:

$CustomData = @{
Times = @(‘São Paulo’,’Corinthians’,’Palmeiras’,’Santos’)
acao = @(‘Ganhou do’,’Perdeu para’,’Empatou com’)
}

Invoke-Generate “[times] [acao] [times]” -CustomData $CustomData

Apesar do resultado ser aleatório, representa uma grande verdade!

Criando um template para seus dados. O template pode facilitar na geração de dados em massa.

$template = “
name = [person]
phone = [randomdate]
“
Invoke-Generate $Template -AsPSObject -Count 10

Mais um exemplo de dados que podemos gerar aleatoriamente utilizando um dataset customizado:

$CustomData = @{
color = @(‘Red’,’Green’,’Blue’,’Black’,’White’)
weekday = @(‘Monday’,’Tuesday’,’Wednesday’,’Thursday’,’Friday’)
team = @(‘IT’,’Accounting’,’Marketing’,’Shipping’,’Administration’,’Sales’)
}

[pscustomobject]@{
id = Invoke-Generate “[guid]”
ComputerName = Invoke-Generate “Host-[state abbr]##”
user = Invoke-Generate “[person]”
Phone = Invoke-Generate “###-###-####”
Datains = Invoke-Generate “[randomdate]”
Status = Invoke-Generate ‘[status]’ -CustomData @{
status = @(‘Secure’,’Unpatched’,’Unsecure’)
}
FavoriteColor = Invoke-Generate “[color]” -CustomData $CustomData
DayOff = Invoke-Generate “[weekday]” -CustomData $CustomData
Team = Invoke-Generate “[team]” -CustomData $CustomData
Address = Invoke-Generate “[Address]”
Age = Invoke-Generate “##”
}

Para trazer essa brincadeira ao nosso mundo de SQL Server, eu desenvolvi o script no link abaixo:

#Load SMO
[Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.Smo”) | Out-Null

#Put your SQL Server instance
$SqlInstance = “DESKTOP-A7S2JPV\SQLSERVER2017”
#Choice a dbname to be created
$Sqldb = “NameIT_DB”
#Number of lines to be inserted on table tb_users
$QtdLines = 1000

#Connect and create database
$srv = new-Object Microsoft.SqlServer.Management.Smo.Server($SqlInstance)
$db = New-Object Microsoft.SqlServer.Management.Smo.Database($srv, $Sqldb)
$db.Create()

#Create the Table called tb_users
$tb = new-object Microsoft.SqlServer.Management.Smo.Table($db, “tb_users”)

#Create columns to table tb_users
$col1 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “Age”, [Microsoft.SqlServer.Management.Smo.DataType]::Int)
$col2 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “street”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(50))
$col3 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “Dateins”, [Microsoft.SqlServer.Management.Smo.DataType]::Varchar(20))
$col4 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “ComputerName”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(100))
$col5 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “Phone”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(100))
$col6 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “Id”, [Microsoft.SqlServer.Management.Smo.DataType]::varchar(50))
$col7 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “capital”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(50))
$col8 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “UserName”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(100))
$col9 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “state”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(5))
$col10 = new-object Microsoft.SqlServer.Management.Smo.Column($tb, “zip”, [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(15))

#Add columns
$tb.Columns.Add($col1)
$tb.Columns.Add($col2)
$tb.Columns.Add($col3)
$tb.Columns.Add($col4)
$tb.Columns.Add($col5)
$tb.Columns.Add($col6)
$tb.Columns.Add($col7)
$tb.Columns.Add($col8)
$tb.Columns.Add($col9)
$tb.Columns.Add($col10)
#Create table tb_users
$tb.Create()

#Create a template to make easier
$template =’
Age = ##
street = [Address]
Datains = [randomdate]
ComputerName = Host-[state abbr]##
Phone = ###-###-####
id = [guid]
capital = [state capital]
user = [person]
state = [state abbr]
zip = [state zip]
‘
#Fill variable called $table and transform to datatable
$table = Invoke-Generate $Template -AsPSObject -Count $QtdLines | ConvertTo-DbaDataTable

#Use Dbatools to write lines on SQL Server database
Write-DbaDataTable -SqlInstance $SqlInstance -InputObject $table -Database $Sqldb -Table $tb.Name

#Refresh table and show qtd lines
$tb.Refresh()
$tb.RowCount

O Script acima utiliza SMO para criar um banco de dados chamado NameIT_DB com uma tabela chamada tb_users, realizando uma inserção de 1000 linhas com dados aleatórios. Para inserção estou utilizando uma função do Dbatools a Write-DbaDataTable.

Cuidado com a quantidade de linhas que deseja inserir – isso pode levar algum tempo, por isso deixei o default de 1000 no script.

Como resultado do comando acima teremos o seguinte retorno:

Dados com nomes de rua, estado, código postal, capital, nomes e datas – a partir daqui você poderá brincar melhor com seus testes. O módulo NameIT proporciona uma riqueza de customização, para você que quer brincar com T-SQL gerar dados fakes pode ser uma ótima opção. Explore um pouco mais no GitHub:

Se você gosta de Python, tem uma biblioteca equivalente em:

Como referência tem o excelente artigo do Kevin Marquette, um mestre em PowerShell:

Bom, galera, ficamos por aqui. Como sempre reforço para que façam exemplos com seus mundos e pratiquem bastante. Espero que gostem e até a próxima!