Shell操作MySqlデータベース
最近の仕事ではMySqlクエリの戻り結果に基づいてSparkタスクをループして開始する必要があります.後で同類のニーズに遭遇して迅速に実現できるように、暇を見つけて共通のスクリプトを書き、ShellでMySqlクエリを実行し、クエリの戻り値を取得することを簡単に実現します.他のデータベースのクエリの原理は似ています.以下のコードに基づいて簡単に修正する必要がある場合は. insert、update、deleteを実行する方法 selectを実行する方法 データ行数を取得する方法 指定行指定列値を取得する方法 .は、上述の共通の方法の完全なスクリプト を含む.例のスクリプト:
# 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 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クエリの処理効率が低く、結果セットが大きい場合はスクリプト処理は推奨されません.