MySQLからJSONを送信する5分または別の方法でのBASH上のDBSlayerプロキシ



それは夕方で、何もすることはありませんでしたが、レッスンの責任者は休息を与えませんでした...この投稿は、純粋に学問的な興味の結果として作成されました。 それはすべて、Javascriptで実装されたニーズに合わせて小さなクライアントアプリケーションを開発する場合、必要なデータが保存されている既存のデータベースと対話する必要が生じたという事実から始まりました。 ベースはMySQLです。 最も簡単な方法の1つは、サーバー側のスクリプト(PHPまたは他の言語)を実装することです。このスクリプトは、着信パラメーターによって必要な要求を作成し、JSON形式で結果を返します。

別のオプションは、MySQL用のDBSlayerプロキシです。 彼のことを聞いたことのある人には誰にも話をしません。私は、ニューヨークタイムズで、データベースの抽象化と負荷分散の手段として生まれました。 code.nytimes.com/projects/dbslayer/wiki/WhyUseItで詳細を読むことができます。 DBSlayerは、NodeJS開発者の間で知られているJSONベースのAPIを提供します。

しかし、これも私たちの方法ではありません。 カットの下には、BASHのこの問題に対する簡単な解決策があります。



まあ、私はこの迷いを置くのが面倒だった、と私は思い出す、タスクは私自身のために、生産ソリューションの負荷や他の喜びなしで解決されました。 PHPでの書き込みは少し疲れています。魂はバラエティといくつかのスレッドを誇示するように求めました。 私は、必要な機能を実装して、BASH上のHTTPサーバーの形式で単純なレイヤーを作成することにしました。

Netcatを、bashに2、3行追加することで、WEBサーバーに変えることができるのは秘密ではありません。 ハブには、それに関する投稿さえありました。 このアイデアを採用して、ファイナライズすると、5分でDBSlayerの単純な類似物が得られます。

言葉から行動まで......


最初に、mysqlコンソールクライアントからの出力をJSON形式に変換する簡単なユーティリティを作成します。

cat ~/bin/mysql2json.sh #!/bin/bash sed -e 's/\t/\",\"/g' \ -e 's/^/\[\"/' \ -e 's/$/\"\],/' \ -e '1s/\(.*\)/\{\"fields\":\1\ \"data\":[/g' -e '$s/.$/\]\}/' \ | tr -d "\n" 


単純に使用されます:
 mysql -e "SELECT * FROM `mytable`" | ./mysql2json.sh {"fields":["field_1","field_2","field_3"],"data":[["1","2","3"],["4","5","6"],["7","8","9"]]} 


サーバーコード自体をdbjs.shファイルに追加します。
 #!/bin/bash :;while [ $? -eq 0 ] do. nc -vlp 8880 -c '( r=read; e=echo; $rabc; z=$r; while [ ${#z} -gt 2 ] do. $rz; done; f=`$e $b|sed 's/[^a-z0-9_.-]//gi'`; h="HTTP/1.0"; o="$h 200 OK\r\n"; c="Content"; m="mysql -ulol -ptrololo" m2j="~/bin/mysql2json.sh" $e "$o$c-Type: text/json"; $e; if [[ ( -n "$f" ) && ( "$f" != "favicon.ico" ) ]] then. $e "+ Connect to [$f]">&2; db=${f%.*}; tb=${f#*.}; if [ "$tb" = "$db" ] then $e `$m ${db:-test} -e "show tables" | $m2j`; else $e `$m ${db:-test} -e "select * from $tb" | $m2j`; fi; else $e `$m -e "show databases" | $m2j`; fi )'; done 


実際にはそれだけです。 コンソールで次のように表示されます:
 [ bash: ./dbjs.sh listening on [any] 8880 ... 


次に、指定されたポートでサーバーに接続し、出力を取得します。
 // http://127.0.0.1:8880 -     { fields: [ "Database" ], data: [ [ "information_schema" ], [ "test" ] ] } 


 // http://127.0.0.1:8880/test -      test { fields: [ "Tables_in_test" ], data: [ ["prods"], ["shops"], ["sp"], ["stat"] ] } 


 // http://127.0.0.1:8880/test.shops -    test.shops { "fields": [ "id", "name", "adress" ], "data": [ ["1","aaaaa",""], ["2","bbbbbbbbb",""], ["3","cccccccccccccccc","ccc"] ] } 


スクリプトは完全ではありませんが、必要がある場合でも、誰もそれを変更することを気にしません。

PS:質問に対して:なぜ?、すぐに答えます:ファンのために。 人生は喜びをもたらさなければなりません。 このような非標準的なソリューションからポジティブになりたいです。

Source: https://habr.com/ru/post/J154191/


All Articles