Ruby DBI Read 操作

DBI はデータベースからレコードを取得するいくつかの異なるメソッドを提供します。仮にdbhデータベースハンドルであり、sthステートメントハンドルです:

番号メソッド & 説明
1db.select_one( stmt, *bindvars ) => aRow | nil
実行する、bindvarsパラメータマーカーにバインドされたstmtステートメント。最初の行を返します。結果セットが空の場合は返しますnil。
2db.select_all( stmt, *bindvars ) => [aRow, ...] | nil

db.select_all( stmt, *bindvars ){ |aRow| aBlock }

実行する、bindvarsパラメータマーカーにバインドされたstmtステートメント。このメソッドをブロックなしで呼び出すと、すべての行を含む配列を返します。ブロックが指定された場合は、各行に対してそのメソッドが呼び出されます。
3sth.fetch => aRow | nil
返します次の行。結果に次の行がない場合は返しますnil。
4sth.fetch { |aRow| aBlock }
結果セット内の残りの行に対して、指定されたブロックを呼び出します。
5sth.fetch_all => [aRow, ...]
結果セット内の残りのすべての行を配列に保存して返します。
6sth.fetch_many( count ) => [aRow, ...]
返します。[aRow, ...] 配列に保存された次のcount行。
7sth.fetch_scroll( direction, offset=1 ) => aRow | nil
返しますdirectionパラメータとoffset指定された行。SQL_FETCH_ABSOLUTE と SQL_FETCH_RELATIVE を除き、他のメソッドはパラメータを破棄しますoffset。directionパラメータの可能な値については、以下の表を参照してください。
8sth.column_names => anArray
列名を返します。
9column_info => [ aColumnInfo, ... ]
DBI::ColumnInfo オブジェクトの配列を返します。各オブジェクトは、ある列に関する情報を格納し、その列の名前、型、精度などのさらに多くの情報を含みます。
10sth.rows => rpc
実行されたステートメントが処理した行数を返しますCount、存在しない場合は返しますnil。
11sth.fetchable? => true | false
行を取得できる場合は返しますtrue、そうでなければ返しますfalse。
12sth.cancel
結果セットが占有しているリソースを解放します。このメソッドを呼び出した後、再度呼び出さない限り、行を取得できません。execute。
13sth.finish
準備されたステートメントが占有するリソースを解放します。このメソッドを呼び出した後、そのオブジェクトに対してそれ以上の操作メソッドを呼び出すことはできません。

direction パラメータ

以下の値はfetch_scrollメソッドの direction パラメータに使用できます:

定数説明
DBI::SQL_FETCH_FIRST最初の行を取得します。
DBI::SQL_FETCH_LAST最後の行を取得します。
DBI::SQL_FETCH_NEXT次の行を取得します。
DBI::SQL_FETCH_PRIOR前の行を取得します。
DBI::SQL_FETCH_ABSOLUTEその位置のオフセットにある行を取得します。
DBI::SQL_FETCH_RELATIVE現在の行からそのオフセット量の位置にある行を取得します。

例

以下の例では、ステートメントのメタデータを取得する方法を示します。EMPLOYEE テーブルがあると仮定します。

#!/usr/bin/ruby -w

require "dbi"

begin
     # 连接到 MySQL 服务器
     dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", 
                        "testuser", "test123")
     sth = dbh.prepare("SELECT * FROM EMPLOYEE 
                        WHERE INCOME > ?")
     sth.execute(1000)
     if sth.column_names.size == 0 then
        puts "Statement has no result set"
        printf "Number of rows affected: %d\n", sth.rows
     else
        puts "Statement has a result set"
        rows = sth.fetch_all
        printf "Number of rows: %d\n", rows.size
        printf "Number of columns: %d\n", sth.column_names.size
        sth.column_info.each_with_index do |info, i|
          printf "--- Column %d (%s) ---\n", i, info["name"]
          printf "sql_type:         %s\n", info["sql_type"]
          printf "type_name:        %s\n", info["type_name"]
          printf "precision:        %s\n", info["precision"]
          printf "scale:            %s\n", info["scale"]
          printf "nullable:         %s\n", info["nullable"]
          printf "indexed:          %s\n", info["indexed"]
          printf "primary:          %s\n", info["primary"]
          printf "unique:           %s\n", info["unique"]
          printf "mysql_type:       %s\n", info["mysql_type"]
          printf "mysql_type_name:  %s\n", info["mysql_type_name"]
          printf "mysql_length:     %s\n", info["mysql_length"]
          printf "mysql_max_length: %s\n", info["mysql_max_length"]
          printf "mysql_flags:      %s\n", info["mysql_flags"]
      end
   end
   sth.finish
rescue DBI::DatabaseError => e
     puts "An error occurred"
     puts "Error code:    #{e.err}"
     puts "Error message: #{e.errstr}"
ensure
     # 断开与服务器的连接
     dbh.disconnect if dbh
end

これにより、以下の結果が生成されます:

Statement has a result set
Number of rows: 5
Number of columns: 5
--- Column 0 (FIRST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precision:        20
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 4
mysql_flags:      0
--- Column 1 (LAST_NAME) ---
sql_type:         12
type_name:        VARCHAR
precision:        20
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     20
mysql_max_length: 5
mysql_flags:      0
--- Column 2 (AGE) ---
sql_type:         4
type_name:        INTEGER
precision:        11
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       3
mysql_type_name:  INT
mysql_length:     11
mysql_max_length: 2
mysql_flags:      32768
--- Column 3 (SEX) ---
sql_type:         12
type_name:        VARCHAR
precision:        1
scale:            0
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       254
mysql_type_name:  VARCHAR
mysql_length:     1
mysql_max_length: 1
mysql_flags:      0
--- Column 4 (INCOME) ---
sql_type:         6
type_name:        FLOAT
precision:        12
scale:            31
nullable:         true
indexed:          false
primary:          false
unique:           false
mysql_type:       4
mysql_type_name:  FLOAT
mysql_length:     12
mysql_max_length: 4
mysql_flags:      32768
その他の拡張