我是靠谱客的博主 拉长羊,最近开发中收集的这篇文章主要介绍Shell操作MySql数据库,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  近期工作中有需求需要根据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数据库所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部