续集:如何获取数据集列的数据类型

时间:2012-11-23 11:36:54

标签: ruby dataset sequel

如何获取数据集列的数据类型。 或者更一般:如何获取数据集的架构?

想象一下我有以下情况:

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

我在文档中没有找到其他方法吗?

1 个答案:

答案 0 :(得分:6)

在续集中,数据集不知道其列的类型。对于任何复杂的事情,了解列类型的唯一方法是运行查询(想想列别名,函数调用,CTE等)。即使这样,你也必须根据Sequel给你的红宝石类型来猜测数据库类型。

您可以将Database#schema与表名一起使用,以获取该表的架构信息。这是在Sequel中从数据库中获取类型信息的唯一受支持方式。