目前,我完全不滿意命令行程序/ usr/bin/mysql!它沒有,例如,讓我的槓桿作用:如何通過IO重定向創建/ usr/bin/mysql包裝程序?
(一)各種Unix工具(如,grep的,sed的......),以及
(二)Unix的概念,如IO重定向,管道。
(順便說一句,IIRC,一個命令行外殼爲Sybase用於使管道和足夠強大的,Unix風格的命令行用法。)
所以...我想知道,如果它是可能爲我的這個吸盤創建一個shell封裝器?
我的第一個版本看起來像這樣。
# #!/bin/bash
sqlUser=USER_NAME
sqlPassword= # The password will be taken from ~/.my.cnf .
# Sql statements specified via stdin.
while read -p 'SQL> ' x
do
if [ "$x" = "quit" ]; then
# Quit the loop.
echo "Goodbye."
break
else
eval "mysql -u$sqlUser -e '$x' "
echo
fi
done
使用範例:
[[email protected]:~/tmp]
$ ./mysqlsh
SQL> select * from bankdb.loan;
+---------+---------------+--------+
| loan_no | branch_name | amount |
+---------+---------------+--------+
| L-11 | Round Hill | 900 |
| L-14 | Downtown | 1500 |
| L-15 | Perryridge | 1500 |
| L-16 | Perryridge | 1300 |
| L-17 | Downtown | 1000 |
| L-23 | Redwood | 2000 |
| L-93 | Mianus | 500 |
+---------+---------------+--------+
SQL> quit
Goodbye.
[[email protected]:~/tmp]
$
現在,雖然我可以對自己說......分號之前添加任何管道/重定向功能「;」在用戶輸入read()將是SQL,以及任何後面的';'將是直接傳遞給上面的eval()的Unix shell結構。 但是,我不確定這是否是最大的方式!
另一個仍然會持續存在的嚴重限制是:由於在while循環的每次迭代中都會重新調用/ usr/bin/mysql,因此將沒有會話的概念。 所以,我真的希望能夠做到是:(一)推出一個,在/ usr/bin中/ MySQL的單一實例,並(B)莫名其妙線的/ usr/bin中/ mysql的stdin,stdout,stderr流到我的包裝程序。 現在,這個特技可能嗎?請注意,我試過 [sd @ host:〜/ tmp] $ mysql -uSD 2> & 1 | tee sql.out ,它沒有按照'預期'工作。意思是,我沒有得到熟悉的mysql交互消息到我的sql.out文件,所以想知道這裏發生了什麼!
如果這不可能通過shell(bash),這可以通過一個C程序來完成......?它使用MySQL的C API來打開數據庫連接,然後通過此連接提供會話感?
Perl可以幫助嗎?
非常感謝您傾聽。
Upvoting。嗯。我的意思是說:一個支持管道,重定向等的交互式mysql shell。以便通過諸如'use XYZdb'之類的命令來獲得「rdbms會話」的意義,開始/結束事務等等。目前,如果我在mysql中操作,我不會獲得管道/重定向,並且如果我操作從沒有(就像你上面提出的那樣),那麼整個事情就會變得太長而笨拙。這就是爲什麼我開始想方設法使用包裝。 (謝謝,順便寫一下,我的聲望目前還不夠高,無法提升你的答案。) – Harry 2009-08-30 02:40:45
由於沒有人回答,我想我會繼續選擇你的答案作爲最佳答案。此外,自從你的迴應後,使用它數個小時後,我或多或少地接受了它。 :-) – Harry 2009-08-30 12:20:47