概述
近期工作中有需求需要根据MySql查询返回结果循环发起Spark任务,为方便以后遇到同类需求能快速实现,所以抽空写了个公共脚本,简单实现在Shell中执行MySql查询及获取查询返回值,其他数据库的查询原理类似,如有需要根据下面代码简单修改即可。
-
执行insert、update、delete的方法
# 执行sql 无需获取返回值,sql执行失败则脚本异常结束 # 参数1 完整的sql语句 function mysqlExecute { mysql -u"${HOST}" -P"${PORT}" -u"${USER}" -p"${PASSWD}" -D"${DATABASE}" -e "$1" if [[ $? -eq 0 ]] then echo "exec sql succeed: " echo "$1" else echo "exec sql failed: " echo "$1" exit -1 fi }
-
执行select的方法
# 执行sql 需获取返回值,sql执行失败则脚本异常结束 # 参数1 完整的select语句 function mysqlExecuteQuery { # 返回结果:-e带表头 -Ne不带表头 rs=(`mysql -u"${HOST}" -P"${PORT}" -u"${USER}" -p"${PASSWD}" -D"${DATABASE}" -Ne "$1"`) if [[ $? -eq 0 ]] then # 打印查询结果中的每一个元素 echo ${rs[*]} else echo "exec sql failed: " echo "$1" exit -1 fi }
-
获取数据行数的方法
# 计算查询返回结果数据行数 # 参数1 select总列数 # 参数2 查询结果数组 function getRowNumFromResult { local rs rs=(`echo "$@"`) echo $[(${#rs[@]}-1)/$1] }
-
获取指定行指定列值的方法
# 获取指定行指定列的值 # 参数1 字段所在行数 # 参数2 字段所在列数 # 参数3 select总列数 # 参数4+ 查询结果数组 function getValueFromResult { local rowIndex local colIndex local column_num local rs rowIndex=$1 colIndex=$2 column_num=$3 rs=(`echo "$@"`) # 下标=总列数*(第几行-1)+第几列-1+非查询结果的其他参数个数 idx=$[$column_num*($rowIndex-1)+$colIndex-1+3] if [[ $[idx] -le ${#rs[@]} ]] then # 根据下标获取目标结果 echo ${rs[$idx]} fi }
-
包含上述公共方法的完整脚本
#!/usr/bin/env bash HOST="localhost" PORT="3306" USER="xiaohai" PASSWD="xiaohai" DATABASE="testdb" # 执行sql 无需获取返回值,sql执行失败则脚本异常结束 # 参数1 完整的sql语句 function mysqlExecute { mysql -u"${HOST}" -P"${PORT}" -u"${USER}" -p"${PASSWD}" -D"${DATABASE}" -e "$1" if [[ $? -eq 0 ]] then echo "exec sql succeed: " echo "$1" else echo "exec sql failed: " echo "$1" exit -1 fi } # 执行sql 需获取返回值,sql执行失败则脚本异常结束 # 参数1 完整的select语句 function mysqlExecuteQuery { # 返回结果:-e带表头 -Ne不带表头 rs=(`mysql -u"${HOST}" -P"${PORT}" -u"${USER}" -p"${PASSWD}" -D"${DATABASE}" -Ne "$1"`) if [[ $? -eq 0 ]] then # 打印查询结果中的每一个元素 echo ${rs[*]} else echo "exec sql failed: " echo "$1" exit -1 fi } # 获取指定行指定列的值 # 参数1 字段所在行数 # 参数2 字段所在列数 # 参数3 select总列数 # 参数4+ 查询结果数组 function getValueFromResult { local rowIndex local colIndex local column_num local rs rowIndex=$1 colIndex=$2 column_num=$3 rs=(`echo "$@"`) # 下标=总列数*(第几行-1)+第几列-1+非查询结果的其他参数个数 idx=$[$column_num*($rowIndex-1)+$colIndex-1+3] if [[ $[idx] -le ${#rs[@]} ]] then # 根据下标获取目标结果 echo ${rs[$idx]} fi } # 计算查询返回结果数据行数 # 参数1 select总列数 # 参数2 查询结果数组 function getRowNumFromResult { local rs rs=(`echo "$@"`) echo $[(${#rs[@]}-1)/$1] }
-
示例脚本:
#!/usr/bin/env bash . ./mysqlConn.sh # select列数 column_num=2 selectSql="select id, name from test;" # 调用方法执行sql,打印出sql执行结果但不获取返回值 mysqlExecute "$selectSql" # 用数组接收查询返回值 result=(`mysqlExecuteQuery "$selectSql"`) # 计算查询返回结果数据行数 row_num=`getRowNumFromResult ${column_num} ${result[*]}` for (( i=1; i<=$row_num; i=i+1)) do # 获取第一列的值 id=`getValueFromResult $[i] 1 $column_num ${result[*]}` # 获取第二列的值 name=`getValueFromResult $[i] 2 $column_num ${result[*]}` echo "id: $id, name: $name" done
注意:Shell中单个数组元素中间包含空格的话在处理时会被认为是多个元素,用下标取值时会出现数据错位,因此在使用Shell查询MySql前需先确认查询结果字段值中间不包含空格。另外,在Shell中处理sql查询结果效率较低,如返回结果集较大,不建议使用脚本处理。
最后
以上就是拉长羊为你收集整理的Shell操作MySql数据库的全部内容,希望文章能够帮你解决Shell操作MySql数据库所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复