使用PowerShell和AWS加载数据本地INFILE

时间:2017-04-08 01:10:42

标签: mysql powershell amazon-web-services

过去两天我一直在搜索谷歌,试着去理解我是否能做到这一点。我在aws上托管了一个MySQL instace,我需要每小时加载一个小的CSV文件。 LOAD DATA LOCAL INFILE似乎是票,但我似乎找不到任何能告诉我如何使用PowerShell从我的机器发送到AWS MySQL实例的地方。有人可以帮我提供代码,或者至少指出一些例子吗?

我可能很接近,我终于找到了一个视频:

[void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")
$csvPath = 'D:/ETL_Data/TwitchTVData.csv'
$srvr = "myRDS.rds.amazonaws.com"
$DB = "TwitchTV_Data"
$uid = "User"
$pwd = "PWD"
$conStr = @"
server=$($srvr);port=3306; database=$();uid=$($uid);pwd=$($pwd)
"@
$conObj = New-Object MySql.Data.MySqlClient.MySqlConnection 
$conObj.ConnectionString = $conStr
$conObj.Open()
$queryStr = "LOAD DATA FROM $($csvPath)
    INTO TABLE TwitchTV_Top10_Game_Data
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    (Game_Name, Viewers, Channels, Snapshot);"
$cmd = New-Object MySql.Data.MySqlClient.MySqlCommand($queryStr, $conn)
$conObj.Close()

我刚收到身份验证错误。所以现在我必须解决这个问题。

修改

我将原始代码修改为

[void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")
$csvPath = 'D:\ETL_Data\TwitchTVData.csv'
$srvr = "myrds.rds.amazonaws.com"
$db = "TwitchTVData"
$uid = "user"
$pwd = "pwd"
$conStr = @"
server=$($srvr);port=3306; database=$($db);uid=$($uid);pwd=$($pwd)
"@
$conObj = New-Object MySql.Data.MySqlClient.MySqlConnection 
$conObj.ConnectionString = $conStr
$conObj.Open()

$csv = Import-Csv $csvPath | select -First 3

foreach ($record in $csv) {
    $queryStr = "INSERT INTO TwitchTV_Top10_Game_Data ($columns) VALUES ('$($record.Game_Name)','$($record.Viewers)','$($record.Channels)','$($record.Snapshot)');"
    $cmd = New-Object MySql.Data.MySqlClient.MySqlCommand($queryStr, $conObj)
}

$conObj.Close()

执行,但不执行任何操作。没有数据进入表中,但没有错误。

按照以下答案:

$cred = Get-Credentials
$csvPath = 'D:\ETL_Data\TwitchTVData.csv'

$con = Connect-MySqlServer -Credential $cred -ComputerName myrds.us-west-2.rds.amazonaws.com -Port 3306

#Define our column headings (needed for the Insert statement)
$columns = "Game_Name,Viewers,Channels,Snapshot"

#import our csv
$csv = Import-Csv $csvPath | select -First 3

foreach ($record in $csv) {
    $query = "INSERT INTO TwitchTV_Top10_Game_Data ($columns) VALUES ('$($record.Game_Name)','$($record.Viewers)','$($record.Channels)','$($record.Snapshot)');"

    "Executing : $query"
    Invoke-MySqlQuery -Query $query -Verbose
    Start-Sleep -Milliseconds 250
}

这给出了评论中提到的错误。

1 个答案:

答案 0 :(得分:5)

所以,我在一个兔子洞里走了WAYYY。

但是我找到了答案,但是我没有使用PowerShell,但是mysql的{​​{1}}实用程序,你可以下载它here。 (链接到我的Sql Utilities 1.6.5)

首先,您需要确保向数据库添加网络规则,以允许它将mysqldbimport的mySQL端口修补到您的VM。确保您的设置至少如下所示:

enter image description here

现在,启动3306,这是您想要的命令和语法。

MySQL Utilities Console

如果您需要端点名称(上面我称之为mysqldbimport --server=yourUserName:YourPassword@YourDBName.us-east-1.rds.amazonaws.com:3306 c:\PathTo\YourFile.csv,请在此处获取。

enter image description here

我希望这有帮助!我将进一步尝试,看看我是否也可以找出PowerShell语法。

使用PowerShell执行

我是谁让朋友挂?它也在PowerShell中工作......但有一些警告。以下是:

  1. 下载MySql ADO Connector
  2. this blog post
  3. 下载Adam Betram令人敬畏的MySQL PowerShell模块

    因此,要下载并导入Adam的模块,请运行以下命令:

    YourDBName.us-east.etc

    现在,要连接到您的Amazon MySQL实例

    invoke-WebRequest  -Uri https://github.com/adbertram/MySQL/archive/master.zip -OutFile  'C:\temp\MySQL.zip'
    expand-archive C:\temp\MySQL.zip c:\somepath\MySql
    import-module c:\somepath\MySql\MySQL-master\MySQL.psm1
    

    现在,如果您需要创建一个表,首先在这样的哈希表中定义列标题和数据类型。

    $cred = Get-Credential
    $con = Connect-MySqlServer -ComputerName yourDB-east-1.rds.amazonaws.com -Credential $cred -Port 3306
    

    如果有效,您将看到以下内容

    $table = @{"DeviceType"="VARCHAR (10)"
    "DriveLetter"="VARCHAR (10)"
    "DriveType  "="VARCHAR (50)"
    "FreeSpace"="VARCHAR (10)"
    "LastLoggedonUser"="VARCHAR (10)"
    "MachineName"="VARCHAR (10)"
    "Manufacturer"="VARCHAR (10)"
    "Model"="VARCHAR (10)"
    "SpaceInMB"="VARCHAR (10)"
    }
    #run this command to create this table
     New-MySqlTable -Table newtable01 -Database test -Column $table -Debug
    

    我的硬盘上挂着一个.csv文件,其中有一些关于计算机硬盘的信息,所以我决定导入它,因为它是星期五晚上,孩子们终于睡着了还有什么是爸爸会为了好玩而做的?

    因此,当您导入它们时,您基本上将解析每一行并运行Tables_in_test -------------- newtable02 命令...但PowerShell是一个巨大的痛苦,因为它没有'尊重列顺序,因此您必须按顺序列出列名...然后列出属性....它很臭。

    这是代码的其余部分。当然,您将修改以匹配您自己的列标题。

    INSERT INTO

    这在哪个方面看起来像这个

    #Define our column headings (needed for the Insert statement)
    $columns="MachineName,Model,Manufacturer,LastLoggedonUser,DriveLetter,DriveType,DeviceType,SpaceInMB,FreeSpace"
    
    #import our csv
    $csv = import-csv C:\temp\input2.csv | select -First 3
    
     ForEach ($record in $csv){
        $query = "INSERT INTO newtable01 ($columns) VALUES ('$($record.MachineName)','$($record.Model)',`
                 '$($record.Manufacturer)','$($record.'Last Logged on User')','$($record.DriveLetter)',`
                 '$($record.DriveType)','$($record.DeviceType)','$($record.'SpaceInMB ')','$($record.'FreeSpace(NA)')');"
    
     "about to exec:$query"
     Invoke-MySqlQuery -Query $query -Verbose
     start-sleep -Milliseconds 250
    
    }
    

    剩下的就是运行about to exec:INSERT INTO newtable01 (MachineName,Model,Manufacturer,LastLoggedonUser,DriveLetter,DriveType,DeviceType,SpaceInMB,FreeSpace) VALUES ('BLAHBLAH','Optiplex980', 'Dell','DUDEBRO','C','WDCWD5000BEKT','Desktop','476837','NULL'); VERBOSE: 0 records found about to exec:INSERT INTO newtable01 (MachineName,Model,Manufacturer,LastLoggedonUser,DriveLetter,DriveType,DeviceType,SpaceInMB,FreeSpace) VALUES ('BLAHBLAH','Optiplex980', 'Dell','SOMEGUY','C','TOSHIBAMK2561GSYN','Desktop','238122','NULL'); VERBOSE: 0 records found about to exec:INSERT INTO newtable01 (MachineName,Model,Manufacturer,LastLoggedonUser,DriveLetter,DriveType,DeviceType,SpaceInMB,FreeSpace) VALUES ('BLAHBLAH','Optiplex980', 'Dell','HAMSANDWICH','C','ST9250410ASATADevice','Desktop','238','122'); VERBOSE: 0 records found 以确定它确实有效......

    enter image description here