最近,由于工作需要,要在脚本中写入mysql命令来操作相应数据库,这就引起了一点值得注意的问题。
大家都知道,脚本虽然方便但执行的依旧是命令行的命令,只是把众多的命令写在一个文件中,通过相应解释器解释后来依次执行!
比如,我提到的上面提到的问题,要在脚本中操作Mysql数据库,就比如写个更新语句吧:
update *** set x=xxx where y=yyy;
首先,得连接Mysql数据库吧!得写个连接Mysql数据库的命令,格式如下:
mysql -h+hostname -u+user -p+passward,
假如要连接远程主机的Mysql,其主机ip为10.0.13.220,用户名为root,密码为qdd123, 则命令可以写成:
mysql -h10.0.13.220 -uroot -pqdd123
如果连接的是本地数据库的话可以省略主机ip,当脚本中单个写这条命令它会帮你连接数据库,但你继续写数据库命令时就会发现命令其实依旧在命令行上单个执行,而且还会报错,并没有反映到数据库中,原因想必大家都知道(脚本中执行语句都是逐条执行的,并且命令都是bash解释器所支持的,而数据库操作命令它是不支持的)。因此,就需要这种写法,那就是通过管道符 ' | ',大家都知道管道符 可以将一个命令的标准输出管道为另外一个命令的标准输入。
需要注意的是管道符的使用有两个条件:
1、管道命令只能处理前一个命令的标准输出,而不能处理标准错误;
2、管道命令右边命令必须能够接收标准输入。
所以,你就可以=在脚本中这样写了:
echo "update sql.table set(sql为数据库名table为该数据库下某个表名) \`x\`='xxx' where \`y\`='yyy';” | mysql -uroot -pqdd123(省略主机名)。
注意这里的字段名单引号用反斜杠转义了,只是因为在我电脑上解释器无法这样解释,所以只得加个转义符,如果支持的话反斜杠可以不加。
这利用了管道的特性,将echo命令的输出(数据库语句)作为管道符后面MySQL数据库连接命令的输入,从而达到在脚本中快捷操作数据库的目的。当然sqlite3数据库也可以:
echo "update table \`x\`='xxx' where \`y\`='yyy';" | sqlite3 ***.conf
这里再加一个比较有用的操作,就是将数据库查询结果导入到一个文件中,可以这样写;
sqlite3 123.db "select * from table_name;">>xxx.txt
这个命令极其的方便,当你想操作数据库某些记录时直接将其导入文件,进行相应的操作。。。