2017-12-13 7 views
1

ich arbeite zu versuchen, den folgenden Prozess zu automatisieren:MySQL Insert Script

  1. die neueste CSV-Datei von einem FTP zum Download.
  2. Laden Sie diese Datei in unsere Datenbank hoch.

Ich habe Schritt eins funktioniert gut, aber Schritt 2 hat mir einige Probleme. Ich denke, ich habe einige Probleme mit meiner Syntax, aber ich kann nicht herausfinden, dass ich falsch mache. Hier ist der Powershell-Skript Ich verwende:

[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() 

und hier ist der Fehler, Ich erhalte:

 
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

Wenn der SQL-Server auf demselben Computer ausgeführt wird, dass Sie das Skript aus ausgeführt werden, dem Pfad 'C: \ Users \ ...' nicht zugänglich sein werden. – Raziel

+1

Ist das nicht der Grund, warum Sie LOCAL hinzufügen, damit die Datei von Ihrem lokalen Computer abgerufen wird? – TurtleBo

Antwort

1

Sie bekommen diese Fehler, weil Sie den Pfadseparator falsch. Der Backslash ist ein Escape-Zeichen in MySQL-Abfragen, so müssen Sie die Schrägstriche mit einem anderen Backslash zu entkommen (ein Backslash in der Abfrage zu erhalten):

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

oder verwenden Schrägstriche:

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

Dies allein wird jedoch den Import nicht erfolgreich machen. Sie müssen auch die richtigen Terminator spezifizieren, so dass der CSV-Datensätze und Felder beim Import erkannt werden:

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 

ändern Sie den Zeilenabschluss, in nur \n wenn Ihre Dateien Zeilenumbrüche als LF (Unix-Stil) codiert sind, anstatt CR-LF (Windows-Stil). Außerdem müssen Sie das doppelte Anführungszeichen in der ENCLOSED BY Klausel mit einem Graviszeichen entkommen, wenn die Anweisung als Powershell-String definieren:

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

Ohne diese zusätzlichen Klauseln die Standardwerte verwendet werden würde, die eine falsche oder nicht verursachen würde Importieren, abhängig von Ihrer Tabellendefinition.

Von der documentation:

Wenn Sie keine FIELDS oder LINES Klausel angeben, werden die Standardwerte die gleiche, als wenn Sie das geschrieben hatte:

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

eine lokale importieren Datei auf einem Remote-Server sollte normalerweise nicht die Ursache für dieses Problem sein, wie Sie bereits vermutet haben, weil dieDas Schlüsselwortweist den Client an, die Datei zum Import an den Server zu senden.

Vom documentation:

Das LOCAL Schlüsselwort wirkt erwarteten Speicherort der Datei und Fehlerbehandlung, wie später beschrieben. LOCAL funktioniert nur, wenn Ihr Server und Ihr Client beide so konfiguriert wurden, dass dies zulässig ist. Wenn beispielsweise mysqld mit der Systemvariablen local_infile deaktiviert gestartet wurde, funktioniert LOCAL nicht. See Section 6.1.6, “Security Issues with LOAD DATA LOCAL”.

Das LOCAL Schlüsselwort wirkt, wo die Datei gefunden werden soll:

  • Wenn LOCAL angegeben, wird die Datei vom Client-Programm auf der Client-Host und an den Server gesendet wird gelesen. Die Datei kann als vollständiger Pfadname angegeben werden, um ihren genauen Speicherort anzugeben. Wenn er als relativer Pfadname angegeben wird, wird der Name relativ zu dem Verzeichnis interpretiert, in dem das Client-Programm gestartet wurde. Wenn Sie LOCAL mit LOAD DATA verwenden, wird eine Kopie der Datei im temporären Verzeichnis des Servers erstellt. Dies ist nicht das Verzeichnis, das durch den Wert tmpdir oder slave_load_tmpdir bestimmt wird, sondern das temporäre Verzeichnis des Betriebssystems und ist im MySQL-Server nicht konfigurierbar. (In der Regel lautet das temporäre Systemverzeichnis /tmp auf Linux-Systemen und C:\WINDOWS\TEMP unter Windows.) Wenn nicht genügend Speicherplatz für die Kopie in diesem Verzeichnis vorhanden ist, kann die LOAD DATA LOCAL-Anweisung fehlschlagen.