【问题标题】:import comma separated string from pipe to mysql db将逗号分隔的字符串从管道导入到 mysql db
【发布时间】:2017-09-21 14:56:38
【问题描述】:

我需要将来自 stdout (speedtest-cli) 的以下逗号分隔字符串插入 mysql db

1746,Vodafone DE,Frankfurt,2017-04-24T16:00:13.708464,292.1655728839447,267.019,119047915.27025849,12007236.796291795

列说明如下: SERVER_ID,SPONSOR,SERVER_NAME,TIMESTAMP,DISTANCE,PING,DOWNLOAD,UPLOAD

在无需将数据保存到 csv 然后将其导入 mysql 的情况下完成此操作的最佳方法是什么?

我能够将逗号分隔的数据转换为 sqlable 数据

SQL_RESULT_DATA=$(echo $RESULT_DATA | sed -e "s/,/','/g;s/^\(.*\)$/'\1'/")

但是

mysql --host=10.8.0.18 --user speedtest --password=speedtest < echo "INSERT INTO `TEST_DATA` (`SERVER_ID`, `SPONSOR`, `SERVER_NAME`, `TIMESTAMP`, `DISTANCE`, `PING`, `DOWNLOAD`, `UPLOAD`) VALUES ( $SQL_RESULT_DATA )"

失败了

-bash: TEST_DATA: command not found
-bash: SERVER_ID: command not found
-bash: SPONSOR: command not found
-bash: SERVER_NAME: command not found
-bash: TIMESTAMP: command not found
-bash: DISTANCE: command not found
-bash: PING: command not found
-bash: DOWNLOAD: command not found
-bash: UPLOAD: command not found
-bash: echo: No such file or directory

表格说明:

MySQL [speedtest]> DESCRIBE TEST_DATA
+-------------+---------+------+-----+---------+----------------+
| Field       | Type    | Null | Key | Default | Extra          |
+-------------+---------+------+-----+---------+----------------+
| TEST_ID     | int(11) | NO   | PRI | NULL    | auto_increment |
| SERVER_ID   | int(11) | NO   |     | NULL    |                |
| SPONSOR     | text    | NO   |     | NULL    |                |
| SERVER_NAME | text    | NO   |     | NULL    |                |
| TIMESTAMP   | text    | NO   |     | NULL    |                |
| DISTANCE    | int(11) | NO   |     | NULL    |                |
| PING        | int(11) | NO   |     | NULL    |                |
| DOWNLOAD    | int(11) | NO   |     | NULL    |                |
| UPLOAD      | int(11) | NO   |     | NULL    |                |
+-------------+---------+------+-----+---------+----------------+

【问题讨论】:

  • 至少显示隐含mysql表的各个字段名
  • 字段是否可以包含逗号,并用引号括起来以保护它?这使得在 shell 脚本中解析它变得更加困难。
  • LOAD DATA INFILE 上的 MySQL 文档展示了如何使用命名管道来避免将 CSV 数据保存到真实文件中。

标签: mysql bash csv sed


【解决方案1】:

让我解释一下你的测试字符串的错误,

mysql --host=10.8.0.18 --user speedtest --password=speedtest < echo

表示“从名为echo的文件中读取标准输入”

" "以字符串形式开始另一个mysql 参数,此参数中包含空格"

INSERT INTO `TEST_DATA`

“执行命令TEST_DATA并将其输出插入此字符串”

(`SERVER_ID`, `SPONSOR`, `SERVER_NAME`, `TIMESTAMP`, `DISTANCE`, `PING`, `DOWNLOAD`, `UPLOAD`) VALUES ( $SQL_RESULT_DATA )"

包含与上述相同的错误,因为反引号用于生成子外壳并获取它的结果

您要使用的是 mysql 命令的 -e 参数来传递查询,并且在该查询中您需要转义反引号,例如

mysql --host=10.8.0.18 --user speedtest --password=speedtest -e "INSERT INTO \`TEST_DATA\` (\`SERVER_ID\`, \`SPONSOR\`, \`SERVER_NAME\`, \`TIMESTAMP\`, \`DISTANCE\`, \`PING\`, \`DOWNLOAD\`, \`UPLOAD\`) VALUES ( $SQL_RESULT_DATA )"

另见:

确保像这样引用 SQL_RESULT_DATA 表达式

SQL_RESULT_DATA="$(echo $RESULT_DATA | sed -e "s/,/','/g;s/^\(.*\)$/'\1'/")"

否则将来可能会导致令人讨厌的通配符和分词问题,这可能会导致安全问题,请参阅https://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多