0

現在、私はコマンドラインプログラム/ usr / bin /mysqlに完全に不満を持っています!たとえば、次のことを活用することはできません。

(a)さまざまなUnixツール(grep、sed ...など)、および

(b)ioリダイレクト、パイピングなどのUnixの概念。

(ところで、IIRC、Sybaseのコマンドラインシェルは、パイピングと十分に強力な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シェル構造になります。しかし、これが最善の方法かどうかはわかりません

  2. まだ続くもう1つの非常に深刻な制限は、次のとおりです。whileループのすべての反復で/ usr / bin / mysqlが新たに呼び出されるため、セッションの概念はありません。したがって、私が本当にやりたいのは、 a)/ usr / bin / mysqlの単一インスタンスを起動し、(b) / usr / bin / mysqlのstdin、stdout、stderrストリームを何らかの方法でワイヤリングすることです。私のラッパープログラム。 さて、このスタントは可能ですか?[sd @ host:〜/ tmp] $ mysql -uSD 2>&1|を試したことに注意してください。teesql.outであり、「期待どおり」に機能しませんでした。つまり、おなじみのmysqlインタラクティブメッセージがsql.outファイルに届かなかったので、ここで何が起こっているのか疑問に思います。

  3. これがシェル(bash)を介して不可能な場合、これはCプログラムを介して実行できますか...?たとえば、MySQLのC APIを使用してデータベース接続を開き、この接続を介したセッションの感覚を提供しますか?

  4. Perlはここで役に立ちますか?

聞いてくれてありがとう。

4

1 に答える 1

0

組み込みのmysqlコマンドラインアプリケーションは、配管、I/Oリダイレクトなどを完全にサポートします。

たとえば、シェルプロンプトで次のコマンドを直接実行できます。

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