2012-11-23 63 views
2

如何獲取數據集列的數據類型。 或更一般的:如何獲取數據集的模式?續集:如何獲取數據集列的數據類型

想象我有以下情況:

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"] 

在文檔中找不到其他方法嗎?

回答

6

在續集中,數據集不知道其列的類型。對於任何複雜的事情,知道列的類型的唯一方法是運行查詢(想想列別名,函數調用,CTE等)。即使那樣,你也必須根據Sequel給你的ruby類型來猜測數據庫類型。

您可以使用Database#schema和表名來獲取該表的架構信息。這是在Sequel中從數據庫獲取類型信息的唯一支持方式。

+0

感謝您的澄清。這也是我的印象,但我想確定它。 – knut