3

データセットの列のデータ型を取得するにはどうすればよいですか? またはより一般的な: データセットのスキーマを取得する方法は?

次の状況があると想像してください。

require 'sequel'
DB = Sequel.sqlite()
DB.create_table(:data){
    nvarchar :key
    timestamp :timestamp
    Date :date
}

sel = DB[:data].select(:key, :timestamp)

今、私が知りたいのはtimestamp、選択した列のデータ型です。

のようなものを取得したいと思いSequel::Dataset#columntype(column)ます。

私はこのような解決策を作りました:

module Sequel
  class Dataset
    def schema()
      schema = []
      self.db.schema(self).each{|colid, coldef|
        next unless self.columns.include?(colid)
        schema << [colid, coldef]
      }
      schema
    end

    def columntype(colname)
      self.schema.each{|colid, coldef|
        next unless colid == colname
        return coldef[:type]
      }
      raise ArgumentError, "#{colname} not part of #{self.inspect}"
    end
  end
end

p sel.schema #-> [[:key, {:allow_null=>true, :default=>nil, :primary_key=>false,....
p sel.columntype(:timestamp) #-> :datetime
p sel.columntype(:key) #-> :string
p sel.columntype(:date) #-> ArgumentError

しかし、この解決策は少し間違っているように見え、結合では機能しません。

p sel.join(:data).columntype(:timestamp)
#-> `schema': can only parse the schema for a dataset with a single from table (Sequel::Error)

私も試しDataset#schema_and_tableましたが、成功しませんでした:

p sel.schema_and_table(sel.first_source_table) #-> [nil, "data"]

ドキュメントで見つけられなかった他の方法はありますか?

4

1 に答える 1

7

Sequel では、データセットは列の型を認識していません。複雑な場合、列の型を知る唯一の方法は、クエリを実行することです (列のエイリアス、関数呼び出し、CTE などを考えてください)。それでも、Sequel が提供する ruby​​ の型に基づいてデータベースの型を推測する必要があります。

テーブル名とともに使用Database#schemaして、そのテーブルのスキーマ情報を取得できます。これは、Sequel でデータベースから型情報を取得するためにサポートされている唯一の方法です。

于 2012-11-25T16:32:46.480 に答える