2009-08-29 63 views
0

目前,我完全不滿意命令行程序/ 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] 
$ 
  1. 現在,雖然我可以對自己說......分號之前添加任何管道/重定向功能「;」在用戶輸入read()將是SQL,以及任何後面的';'將是直接傳遞給上面的eval()的Unix shell結構。 但是,我不確定這是否是最大的方式

  2. 另一個仍然會持續存在的嚴重限制是:由於在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文件,所以想知道這裏發生了什麼!

  3. 如果這不可能通過shell(bash),這可以通過一個C程序來完成......?它使用MySQL的C API來打開數據庫連接,然後通過此連接提供會話感?

  4. Perl可以幫助嗎?

非常感謝您傾聽。

回答

0

內置的mysql命令行應用程序絕對支持管道,I/O重定向等。

例如,我可以直接在我shell提示符下執行以下命令:

$ echo "SELECT things FROM some_table" | mysql some_database | grep excitement > output.txt 
+0

Upvoting。嗯。我的意思是說:一個支持管道,重定向等的交互式mysql shell。以便通過諸如'use XYZdb'之類的命令來獲得「rdbms會話」的意義,開始/結束事務等等。目前,如果我在mysql中操作,我不會獲得管道/重定向,並且如果我操作從沒有(就像你上面提出的那樣),那麼整個事情就會變得太長而笨拙。這就是爲什麼我開始想方設法使用包裝。 (謝謝,順便寫一下,我的聲望目前還不夠高,無法提升你的答案。) – Harry 2009-08-30 02:40:45

+0

由於沒有人回答,我想我會繼續選擇你的答案作爲最佳答案。此外,自從你的迴應後,使用它數個小時後,我或多或少地接受了它。 :-) – Harry 2009-08-30 12:20:47