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 回答