Shell操作MySqlデータベース

17402 ワード

最近の仕事では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クエリの処理効率が低く、結果セットが大きい場合はスクリプト処理は推奨されません.