我尝试使用 powershell 脚本将 csv 文件中的数据插入 mysql 数据库。在LOAD DATA
查询中使用(虚拟)变量时,我遇到了麻烦。
可重现的示例:创建一个 Mysql 数据库和表
CREATE DATABASE loadfiletest;
USE loadfiletest;
CREATE TABLE testtable (field1 INT, field2 INT DEFAULT 0);
创建一个名为loadfiletestdata.csv
包含的 csv 文件
1,3
2,4
创建 powershell 脚本(不要忘记更改数据库密码和可能的用户名)
[system.reflection.assembly]::LoadWithPartialName("MySql.Data")
$mysqlConn = New-Object -TypeName MySql.Data.MySqlClient.MySqlConnection
$mysqlConn.ConnectionString = "SERVER=localhost;DATABASE=loadfiletest;UID=root;PWD=pwd"
$mysqlConn.Open()
$MysqlQuery = New-Object -TypeName MySql.Data.MySqlClient.MySqlCommand
$MysqlQuery.Connection = $mysqlConn
$MysqlQuery.CommandText = "LOAD DATA LOCAL INFILE 'C:/path/to/files/loadfiletestdata.csv' INTO TABLE loadfiletest.testtable FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '""' LINES TERMINATED BY '\r\n' (field1, field2)"
$MysqlQuery.ExecuteNonQuery()
将所有内容放在文件夹中C:/path/to/files/
(也应该是您在 powershell 脚本中的路径)并运行脚本。这会在表格testtable
中填充
field1 field2
1 3
2 4
正如人们所期望的那样。这意味着引号之类的应该是这样的。每次执行脚本时,这些值都会插入到表中。(field1, field2)
现在,当我将 powershell 脚本的最后一行替换为 时(field1, @dummy)
,我希望这些值
field1 field2
1 0
2 0
被插入到表中。但是,我收到错误
Exception calling "ExecuteNonQuery" with "0" argument(s): "Fatal error encountered during command execution."
At C:\path\to\files\loadfiletest.ps1:8 char:1
+ $queryOutput = $MysqlQuery.ExecuteNonQuery()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : MySqlException
@dummy
从 mysql 客户端运行查询时,它可以工作。在我看来,语法与mysql 手册中的语法相同(在页面中间的某处,查找@dummy
)。
我做了一些进一步的实验,表明任何LOAD DATA
包含变量@whatever
的查询都会给出错误。
所以问题是:为什么它不起作用?有没有办法LOAD DATA
使用 powershell 中的(虚拟)变量执行查询?如果没有,是否有优雅的解决方法?
明显的解决方法是根据表的布局创建中间 csv 文件或创建与 csv 文件布局匹配的中间表。然而,对于恕我直言应该“正常工作”的东西来说,这似乎既丑陋又麻烦。
注意:本题是本题的后续和概括。我选择开始一个新问题,因为替换旧内容会使已经给出的答案过时,并且添加此问题的内容会使旧问题变得冗长且充满无用的支线。