Ruby DBI 方法

  • DBI方法

    DBI提供了几种不同的方法来从数据库中获取记录。假设dbh是数据库句柄而sth是语句句柄-
    方法 说明
    db.select_one( stmt, *bindvars ) = > aRow | nil 使用绑定到参数标记的bindvars预先执行stmt语句。 返回第一行,如果结果集为空,则返回nil。
    db.select_all( stmt, *bindvars ) => [aRow, ...] | nil     db.select_all( stmt, *bindvars ){ |aRow| aBlock } 使用绑定到参数标记的bindvars预先执行stmt语句。调用此方法时不阻塞将返回包含所有行的数组。如果给出一个块,将为每一行调用该块。
    sth.fetch => aRow | nil 返回下一行。如果结果集中没有其他行,则返回nil。
    sth.fetch { |aRow| aBlock } 为结果集的其余行调用给定的块。
    sth.fetch_all => [aRow, ...] 返回数组中收集的结果集的所有剩余行。
    sth.fetch_many( count ) => [aRow, ...] 返回在[aRow,...]数组中收集的下一个计数行。
    sth.fetch_scroll( direction, offset=1 ) => aRow | nil 返回由direction参数和offset指定的行。对于SQL_FETCH_ABSOLUTE和SQL_FETCH_RELATIVE以外的所有参数,将丢弃参数offset。有关方向参数的可能值,请参见下表。
    sth.column_names => anArray 返回列的名称。
    column_info => [ aColumnInfo, ... ] 返回一个DBI::ColumnInfo对象的数组。每个对象都存储有关一列的信息,并包含其名称,类型,精度等。
    sth.rows => rpc 返回已执行语句的“行处理计数”;如果不存在,则返回nil。
    sth.fetchable? => true | false 如果可以获取行,则返回true,否则返回false。
    sth.cancel 释放结果集所拥有的资源。调用此方法后,将无法再获取行,直到再次调用execute。
    sth.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表。
    
    require "dbi"
     
    begin
       # 连接到 MySQL 服务器
       dbh = DBI.connect("DBI:Mysql:test:192.168.61.201", "root", "123456")
       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
       # disconnect from server
       dbh.disconnect if dbh
    end
    
    运行上面的代码,如果您能正确连接数据库,应该返回类型下面的消息:
    
    Statement has a result set
    Number of rows: 1
    Number of columns: 5
    --- Column 0 (FIRST_NAME) ---
    sql_type:         12
    type_name:        VARCHAR
    precision:        20
    scale:            0
    nullable:         false
    indexed:          false
    primary:          false
    unique:           false
    mysql_type:       254
    mysql_type_name:  VARCHAR
    mysql_length:     20
    mysql_max_length: 4
    mysql_flags:      4097
    --- 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: 2
    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