Dev (Back & Front)ARTIGO

NameIT + Dbatools gerando tabela com dados Fake

Neste artigo, o autor apresenta um módulo de PowerShell e mostra como gerar uma tabela com dados Fake através do NameIT e do Dbatools.

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!

Co-Chapter Leader do local group SQL Vale, MTAC - Multi-Platform Audience Contributor, palestrante em eventos pelo Brasil como SQL Saturday, Zero to Hero, TDC e Azure Bootcamp, possuí certificações Microsoft MCP, MCSA e MCSE. Atualmente possuí o cargo de Sênior Data Platform Consultant na Dataside, atuando em projetos de missão crítica com as principais tecnologias de alta disponibilidade e recuperação de desastre, performance tuning e Power BI. Entusiasta de tecnologia, tem como foco principal SQL Server, MongoDB, Cassandra, PowerBI e C# em sua carreira de atuação.

Ver perfil