Script PowerShell para obtener datos de la API de terceros e insertar en la base de datos -- sql campo con mysql campo con database campo con powershell camp codereview Relacionados El problema

PowerShell Script to get data from Third Party API and insert into database


3
vote

problema

Español

He creado un script de PowerShell que llamará a una API de reposo y luego para cada nodo devuelto, agregue los datos a una tabla de base de datos. Este punto final en particular solo devuelve ~ 600 registros de datos, sin embargo, este es el método que usaré para un montón de otros puntos finales de API.

Hay un par de cosas que creo que ayudaría con este guión:

  • a granel Agregue los registros a la base de datos en lugar de uno por uno
  • Para el ON DUPLICATE KEY UPDATE solo cambia los campos que son diferentes.

Mi comprensión de ON DUPLICATE KEY UPDATE Se verificará si existe el Scryid, y si se actualiza, actualiza los campos que se enumeran a continuación. Me gustaría aprovechar solo los campos diferentes.

script:

  If ( Get-Module -ListAvailable -Name SimplySQL ) { Import-Module -Name SimplySQL } Else { Install-Module -Name SimplySQL -Force }  Write-Host "---------------------------------------------------------------------------" -ForegroundColor DarkGray Write-Host "Update Production.Set' Table: " -ForegroundColor Gray -NoNewline $StartTime = $(Get-Date)  $Response = Invoke-RestMethod -Uri "https://api.scryfall.com/sets" -Method GET -UseBasicParsing $ResponseSorted = $Response.data | Sort-Object -Property @{Expression = "released_at"; Descending = $False}  $username = "" $password = ConvertTo-SecureString "" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $password)  Open-MySQLConnection -Server "" -Port 1234 -Database "Production" -Credential $credential  Foreach ( $Record in $ResponseSorted ) {     $ScryID = $Record.id     $Code = Try{ ($Record.code).ToUpper() } Catch {}     $Name = Try{ ($Record.name) -replace "'","" } Catch {}     $SetType = $Record.set_type     $ReleaseDate = $Record.released_at     $CardCount = $Record.card_count     $BlockCode = Try{ ($Record.block_code).ToUpper() } Catch {}     $BlockName = $Record.block     $ParentSetCode = Try{ ($Record.parent_set_code).ToUpper() } Catch {}     $Digital = $Record.digital     $NonFoil = $Record.nonfoil_only     $Foil = $Record.foil_only     $Icon = $Record.icon_svg_uri     $Status = 0      Invoke-SQLUpdate -query "         INSERT INTO Production.`Set`             (ScryID, Code, Name, SetType, ReleaseDate, CardCount, BlockCode, BlockName, ParentSetCode, Digital, NonFoil, Foil, Icon, Status)         VALUES             ( '$ScryID', '$Code', '$Name', '$SetType', '$ReleaseDate', $CardCount, '$BlockCode', '$BlockName', '$ParentSetCode', $Digital, $NonFoil, $Foil, '$Icon', $Status )         ON DUPLICATE KEY UPDATE             Code = '$Code',             Name = '$Name',             SetType =  '$SetType',             ReleaseDate = '$ReleaseDate',             CardCount = $CardCount,             BlockCode = '$BlockCode',             BlockName = '$BlockName',             ParentSetCode = '$ParentSetCode',             Digital = $Digital,             NonFoil = $NonFoil,             Foil = $Foil,             Icon = '$Icon'     " | Out-Null }  Close-SQLConnection  $ElapsedTime = $(Get-Date) - $StartTime $TotalTime = "{0:HH:mm:ss.fff}" -f ([datetime]$ElapsedTime.Ticks) Write-Host $TotalTime -ForegroundColor Cyan    
Original en ingles

I have created a PowerShell script that will call a REST API and then for each node returned, add the data into a database table. This particular endpoint only returns ~600 records worth of data, however this is the method I will be using for a bunch of other API endpoints.

There are a couple things I think would help with this script:

  • Bulk add the records into the database rather than one by one
  • For the ON DUPLICATE KEY UPDATE only change fields that are different.

My understanding of ON DUPLICATE KEY UPDATE it will check if the ScryId exists, and if it does then update the fields listed below. I would like to only update the fields that are different.

Script:

If ( Get-Module -ListAvailable -Name SimplySQL ) { Import-Module -Name SimplySQL } Else { Install-Module -Name SimplySQL -Force }  Write-Host "---------------------------------------------------------------------------" -ForegroundColor DarkGray Write-Host "Update Production.Set' Table: " -ForegroundColor Gray -NoNewline $StartTime = $(Get-Date)  $Response = Invoke-RestMethod -Uri "https://api.scryfall.com/sets" -Method GET -UseBasicParsing $ResponseSorted = $Response.data | Sort-Object -Property @{Expression = "released_at"; Descending = $False}  $username = "" $password = ConvertTo-SecureString "" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $password)  Open-MySQLConnection -Server "" -Port 1234 -Database "Production" -Credential $credential  Foreach ( $Record in $ResponseSorted ) {     $ScryID = $Record.id     $Code = Try{ ($Record.code).ToUpper() } Catch {}     $Name = Try{ ($Record.name) -replace "'","" } Catch {}     $SetType = $Record.set_type     $ReleaseDate = $Record.released_at     $CardCount = $Record.card_count     $BlockCode = Try{ ($Record.block_code).ToUpper() } Catch {}     $BlockName = $Record.block     $ParentSetCode = Try{ ($Record.parent_set_code).ToUpper() } Catch {}     $Digital = $Record.digital     $NonFoil = $Record.nonfoil_only     $Foil = $Record.foil_only     $Icon = $Record.icon_svg_uri     $Status = 0      Invoke-SQLUpdate -query "         INSERT INTO Production.`Set`             (ScryID, Code, Name, SetType, ReleaseDate, CardCount, BlockCode, BlockName, ParentSetCode, Digital, NonFoil, Foil, Icon, Status)         VALUES             ( '$ScryID', '$Code', '$Name', '$SetType', '$ReleaseDate', $CardCount, '$BlockCode', '$BlockName', '$ParentSetCode', $Digital, $NonFoil, $Foil, '$Icon', $Status )         ON DUPLICATE KEY UPDATE             Code = '$Code',             Name = '$Name',             SetType =  '$SetType',             ReleaseDate = '$ReleaseDate',             CardCount = $CardCount,             BlockCode = '$BlockCode',             BlockName = '$BlockName',             ParentSetCode = '$ParentSetCode',             Digital = $Digital,             NonFoil = $NonFoil,             Foil = $Foil,             Icon = '$Icon'     " | Out-Null }  Close-SQLConnection  $ElapsedTime = $(Get-Date) - $StartTime $TotalTime = "{0:HH:mm:ss.fff}" -f ([datetime]$ElapsedTime.Ticks) Write-Host $TotalTime -ForegroundColor Cyan  
           

Lista de respuestas


Relacionados problema

2  Agregando algunas propiedades a un usuario de Active Directory  ( Adding some properties to an active directory user ) 
Estaba escribiendo la siguiente sección del código que agrega algunas propiedades de usuario a un usuario de Active Directory, y se preguntó, seguramente pode...

9  Convierta una contraseña a una cadena fonética para usuarios finales  ( Convert a password to a phonetic string for end users ) 
Tanto como lo odio, a veces proporcionar contraseñas a las personas debe hacerse electrónicamente. Cuando hago eso, trato de eliminar cualquier ambigüedad que...

3  Eliminar seda huérfana + cambio a control completo  ( Delete orphaned sids change to full control ) 
Necesito eliminar todos los SID huérfanos en las ACL de aproximadamente 20 acciones (entre 100 GB / 6TB) y cambiar el control total de los grupos de usuarios ...

1  Exportando bolsas, listas de saltos y archivos LNK con PowerShell  ( Exporting shellbags jump lists and lnk files with powershell ) 
Soy nuevo en PowerShell (comenzó ayer) y se preguntó si hay una forma de exportar bolsas de cáscara, listas de saltos y archivos LNK de la Región de Región de...

6  Sherlock va en contra de la bestia con PowerShell  ( Sherlock is going against the beast with powershell ) 
I corrí a este desafío un par de veces hoy y pensé que podría abordarlo con Potencia Shell. Me negué a mirar a otros enfoques de los pueblos a esto con la e...

10  Comparación de hash MD5 para dos carpetas  ( Md5 hash comparison for two folders ) 
usando esta página para un punto de partida para comparar el hash md5 Valores de los archivos en dos carpetas diferentes, he colocado algo juntos que las em...

8  Actualizando múltiples repositorios SVN usando PowerShell  ( Updating multiple svn repositories using powershell ) 
Escribí un script para realizar ReportWithSections2 en todos los repositorios SVN dentro de una carpeta. Hubiera sido genial si la carpeta que contiene todo...

2  Resume un directorio con PowerShell  ( Summarize a directory with powershell ) 
Estoy tratando de generar información agregada sobre un árbol de directorios (extensión de archivo más conteo y tamaño acumulativo por tipo de archivo) con Po...

9  Script PowerShell para manipular archivos de Excel  ( Powershell script for manipulating excel files ) 
Tengo un directorio de libros de trabajo .xls con la siguiente convención de nomenclatura: public class Hand { // in general it is one idea more corr...

6  Extraiga la cadena de la versión del archivo de texto con PowerShell  ( Extract version string from text file with powershell ) 
Necesito tirar de la versión # de un script de VIM que podría parecer algo así: #!/bin/bash LAST=`exec ls example_dir | sed 's/([0-9]+).*/1/g' | sort -n |...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos