0

目前,我对命令行程序 /usr/bin/mysql 非常不满意!它不会,例如,让我利用:

(a) 各种 Unix 工具(如 grep、sed...),以及

(b) Unix 概念,例如 io 重定向、管道。

(顺便说一句,IIRC,Sybase 的命令行 shell,用于允许管道和足够强大的 Unix 风格的命令行使用。)

所以......我想知道,是否可以自己为这个吸盘创建一个外壳包装?

我的第一个版本看起来像这样。

# #!/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

示例用法:

[sd@host:~/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.
[sd@host:~/tmp]
$ 
  1. 现在,虽然我可以通过对自己说......分号';'之前的任何内容来添加管道/重定向功能 在 read() 的用户输入中将是 SQL,以及 ';' 之后的任何内容 将是直接传递给上面的 eval() 的 Unix shell 结构。但是,我不确定这是否是最好的方法

  2. 另一个仍然存在的非常严重的限制是:将没有会话的概念......由于在 while 循环的每次迭代中都对 /usr/bin/mysql 进行了新的调用。所以,我真正想做的是:(a)启动一个 /usr/bin/mysql 的单个实例,以及(b) 以某种方式将 /usr/bin/mysql 的 stdin、stdout、stderr 流连接到我的包装程序。 现在,这个特技可能吗?请注意,我尝试了 [sd@host:~/tmp] $ mysql -uSD 2>&1 | tee sql.out 并且它没有按“预期”工作。意思是,我没有在我的 sql.out 文件中获得熟悉的 mysql 交互消息,所以想知道这里发生了什么!

  3. 如果通过 shell (bash) 无法做到这一点,是否可以通过 C 程序来完成...?例如,使用 MySQL 的 C API 打开数据库连接,然后通过该连接提供会话感?

  4. Perl 能帮上忙吗?

非常感谢您的收听。

4

1 回答 1

0

内置的mysql命令行应用程序绝对支持管道、I/O 重定向等。

例如,我可能会直接在我的 shell 提示符下执行这个命令:

$ echo "SELECT things FROM some_table" | mysql some_database | grep excitement > output.txt
于 2009-08-29T14:19:36.060 回答