2017-12-13 23 views
1

私は、次のプロセスを自動化しようとしているに取り組んでいます:MySQLの挿入スクリプト

  1. はFTPから最新の.csvファイルをダウンロードしてください。
  2. そのファイルをデータベースにアップロードします。

ステップ1は正常ですが、ステップ2では問題が発生しています。私は構文にいくつかの問題があると思うが、私が間違っていると分かりません。ここで私が使用していPowerShellスクリプトは次のとおりです。

[System.Reflection.Assembly]::LoadWithPartialName("MySql.Data") 
$mysqlConn = New-Object -TypeName MySql.Data.MySqlClient.MySqlConnection 
$mysqlConn.ConnectionString = "SERVER=****.net;DATABASE=****;UID=****;PWD=****" 
$mysqlConn.Open() 
$MysqlQuery = New-Object -TypeName MySql.Data.MySqlClient.MySqlCommand 
$MysqlQuery.Connection = $mysqlConn 
$MysqlQuery.CommandText = "LOAD DATA LOCAL INFILE 'C:\Users\Lucy\Documents\FTPFiles\vc_report_20171211.csv' INTO TABLE campaigns IGNORE 1 LINES" 
$MysqlQuery.ExecuteNonQuery() 

、ここでは、私が受けていますエラーです:

 
Exception calling "ExecuteNonQuery" with "0" argument(s): "Fatal error encountered 
during command execution." 
At C:\Users\Lucy\Documents\FTPFiles\upload.ps1:8 char:1 
+ $MysqlQuery.ExecuteNonQuery() 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : MySqlException 
+1

SQLサーバーを使用すると、パス 'C、からスクリプトを実行している同じコンピュータ上で実行されていない場合:\ Users \ユーザー...アクセスできるようにするつもりはない'されます。 – Raziel

+1

LOCALを追加してローカルコンピュータからファイルを取得するのはなぜですか? – TurtleBo

答えて

1

あなたはパス区切りが間違ってましたので、あなたがそのエラーを取得しています。バックスラッシュは、MySQLのクエリでのエスケープ文字であるので、あなたは(クエリ内のリテラルのバックスラッシュを得るために)別のバックスラッシュとバックスラッシュをエスケープする必要があります。

LOAD DATA LOCAL INFILE 'C:\\path\\to\\your.csv' 
INTO TABLE campaigns 
IGNORE 1 LINES 

または使用スラッシュ:

LOAD DATA LOCAL INFILE 'C:/path/to/your.csv' 
INTO TABLE campaigns 
IGNORE 1 LINES 

しかし、それだけでは輸入は成功しません。 CSVレコードとフィールドがインポート時に認識されるようにあなたはまた、適切なターミネータを指定する必要があります。

LOAD DATA LOCAL INFILE 'C:/path/to/your.csv' 
INTO TABLE suppliers 
FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n' 
IGNORE 1 LINES 

変更行末にちょうど\nあなたのファイルは、改行はLF(UNIX形式)としてエンコードしている場合ではなく、 CR-LF(ウィンドウスタイル)。デフォルト値が使用されるこれらの追加条項がなければ

$MysqlQuery.CommandText = "LOAD DATA ... ENCLOSED BY '`"' ... IGNORE 1 LINES" 
#             ^

、不正または失敗を引き起こす:PowerShellの文字列として文を定義する際にも、あなたはバッククォートでENCLOSED BY句に二重引用符をエスケープする必要がありますインポート、テーブル定義に応じて。 documentationから

あなたは何FIELDSまたはLINES句を指定しない場合は、この書かれていたかのように、デフォルト値が同じである:ローカルのインポート

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' 
LINES TERMINATED BY '\n' STARTING BY '' 

をあなたが既に疑っているように、リモートサーバーへのファイルは通常、この問題の原因ではありません。なぜなら、LOCALキーワードは、ファイルをインポートするためにサーバーに送信するようにクライアントに指示します。 documentationから

:後述するように

LOCALキーワードは、予想されるファイルの場所とエラー処理に影響を与えます。 LOCALは、サーバーとクライアントの両方が許可するように構成されている場合にのみ機能します。たとえば、local_infileシステム変数を無効にしてmysqldを起動した場合、LOCALは機能しません。 See Section 6.1.6, “Security Issues with LOAD DATA LOCAL”。ファイルが見つかったことが予想される場所

LOCALキーワードが影響します。

  • LOCALが指定されている場合は、ファイルがクライアントホスト上のクライアントプログラムによって読み取られ、サーバーに送信されます。ファイルは完全なパス名として指定して、正確な場所を指定することができます。相対パス名として指定された場合、その名前はクライアントプログラムが起動されたディレクトリを基準として解釈されます。

    LOCALLOAD DATAとすると、ファイルのコピーがサーバーの一時ディレクトリに作成されます。これは、tmpdirまたはslave_load_tmpdirの値で決定されるディレクトリではなく、オペレーティングシステムの一時ディレクトリであり、MySQLサーバでは設定できません。 (通常、システムの一時ディレクトリは、Linuxシステムでは/tmp、WindowsではC:\WINDOWS\TEMPです。)このディレクトリにコピーするための十分なスペースがないと、LOAD DATA LOCAL文が失敗する可能性があります。