我一直在尝试使用shell(bash)脚本将行插入REMOTE数据库,但我遇到了一些麻烦:(
该脚本用于将文件上载到服务器,获取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.site.com/$hash','$file','$size');
echo "done"
done
我在编程方面是一个总菜鸟,所以你好:P
无论如何,我添加了\以逃避括号,因为我遇到了错误。就像现在一样,脚本工作正常,直到连接到mysql数据库。它只是连接到mysql数据库而不执行insert命令(我甚至不知道insert命令是否可以在bash中工作)。
PS:我已经从命令行逐个尝试了两个mysql命令,虽然我定义了哈希/文件/大小但没有转义为“\”,但它们都有效。
无论如何,你们怎么想?是我试图做甚至可能吗?如果是这样的话?
任何帮助将不胜感激:)
答案 0 :(得分:29)
insert语句必须发送到mysql,而不是shell脚本中的另一行,所以你需要把它变成“here 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
<< EOF
表示除了EOF
之外只包含{{1}}(开头没有空格)之外的所有内容,作为程序的标准输入。
答案 1 :(得分:11)
这可能不是您正在寻找的,但它是一种选择。
如果您想绕过在sh脚本中实际包含查询的烦恼,可以将查询保存为.sql文件(有时在查询非常复杂时很有用)。这可以使用您正在使用的任何语言的简单文件IO来完成。
然后你可以简单地在你的sh scrip中包含:
mysql -u youruser -p yourpass -h remoteHost < query.sql &
这称为批处理模式执行。 (可选)您可以在末尾包含“&”符号,以确保sh脚本的该行不会阻止。
此外,如果您担心多次输入相同的数据并且您的rdbms不一致,您应该探索MySql事务(提交,回滚等)。
答案 2 :(得分:5)
不要使用bash中的原始SQL; bash没有预先确定数据清理的合理设施。生成CSV文件并上传。