【问题标题】:Using shell script to insert data into remote MYSQL database使用 shell 脚本将数据插入远程 MYSQL 数据库
【发布时间】:2011-04-23 11:08:57
【问题描述】:

我一直在尝试获取一个 shell(bash) 脚本来将一行插入到远程数据库中,但是我遇到了一些麻烦:(

该脚本旨在将文件上传到服务器,获取 URL、HASH 和文件大小,连接到远程 mysql 数据库,并将数据插入现有表中。在远程 MYSQL 数据库位之前,我已经让它工作了。

看起来像这样:

#!/bin/bash

zxw=randomtext
description=randomtext2

for file in "$@"
 do
 echo -n *****
 ident= *****
 data= ****
 size=` ****
 hash=`****
mysql --host=randomhost --user=randomuser --password=randompass randomdb
insert into table (field1,field2,field3) values('http://www.example.com/$hash','$file','$size');
echo "done"
done

我在编程方面完全是个菜鸟,所以是的:P

无论如何,当我遇到错误时,我添加了 \ 来转义括号。就像现在一样,脚本可以正常工作,直到连接到 mysql 数据库。它只是连接到mysql数据库并且不执行插入命令(我什至不知道插入命令是否可以在bash中工作)。

PS:我已经从命令行一个一个地尝试了两个mysql命令,它们都工作了,虽然我定义了哈希/文件/大小并且没有转义“”。

不管怎样,你们怎么看?我想要做的甚至可能吗?如果有怎么办?

任何帮助将不胜感激:)

【问题讨论】:

    标签: mysql bash scripting shell


    【解决方案1】:

    不要使用来自 bash 的原始 SQL; bash 没有预先清理数据的健全设施。生成 CSV 文件并上传。

    【讨论】:

    • 这意味着完全自动化,许多文件都经过这个过程。如果我使用 CSV 文件或其他文件,这不会导致相同数据的重复条目的可能性吗? --> 原谅我可能的无知!
    • 如果您需要一个字段或一组字段在整个表中是唯一的,那么您应该创建一个唯一索引。
    • 我想在堆栈上添加另一个答案,说不使用 csv 文件。如果您连接到远程 MySQL 数据库,则很难在本地生成 csv。您必须想办法远程生成 csv,然后将其传输到本地目录。另一个答案推荐管道。那么它是哪一个?我们使用 csvs 还是不使用?!
    【解决方案2】:

    insert语句必须发送到mysql,而不是shell脚本中的另一行,所以你需要把它变成一个“here文档”。

    mysql --host=randomhost --user=randomuser --password=randompass randomdb << EOF
    insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size');
    EOF
    

    &lt;&lt; EOF 表示将下一行之前除EOF(开头没有空格)以外的所有内容作为程序的标准输入。

    【讨论】:

    • 出现此错误:第 22 行:警告:第 19 行的此处文档由文件结尾(需要 `EOF')分隔 第 23 行:第 23 行:语法错误:意外结束文件
    • @lelouch - 您在上面第三行中省略了“EOF”。实施所有解决方案很重要,而不仅仅是前半部分。
    • 嗯,我清楚地在 mysql 行中添加了
    • 通过谷歌搜索保存:forums.oracle.com/forums/… 现在可以使用了!!楼主,真是个天才,非常感谢! :)
    • 哦,是的,我可能应该提到 EOF 必须位于行首。
    【解决方案3】:

    这可能不是您正在寻找的,但它是一个选项。

    如果您想绕过在 sh 脚本中实际包含查询的烦恼,您可以将查询保存为 .sql 文件(有时当查询非常大且复杂时很有用)。这可以通过您使用的任何语言的简单文件 IO 来完成。

    然后你可以简单地在你的 sh 脚本中包含如下内容:

    mysql -u youruser -p yourpass -h remoteHost < query.sql &
    

    这称为批处理模式执行。或者,您可以在末尾包含与号,以确保 sh 脚本的该行不会阻塞。

    此外,如果您担心多次输入相同的数据并且您的 rdbms 变得不一致,您应该探索 MySql 事务(提交、回滚等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2017-03-16
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多