我是 Sequel 的主要开发人员,所以这个回应显然是有偏见的,但我不知道有任何 ruby 数据库库可以满足你的所有需求。
看起来你的一些欲望在 Sequel 中是被感知的限制,其中一些可以解决:
- 没有字段映射的原始值选择:SELECT col1, col2, col3 => [val1, val2, val3] not hash of { :col1 => val1 ...}
尝试:
DB[:table].filter([:col1, :col2, :col3].zip([1, 2, 3]))
# SELECT * FROM table WHERE ((col1 = 1) AND (col2 = 2) AND (col3 = 3))
添加一个新的数据集方法为上述内容提供更好的 API 是微不足道的:
DB[:table].bfilter([:col1, :col2, :col3], [1, 2, 3])
- 能够传递要选择的列/值列表: select(array_of_columns) (不是:dataset.select(:col1, :col2, :col3) 要求列是已知的)
尝试:
array_of_columns = [:col1, :col2, :col3]
DB[:table].select(*array_of_columns)
# SELECT col1, col2, col3 FROM table
- API 以一致(且有效)的方式考虑表模式“some_schema.some_table”;也对此进行反思(从表中获取架构)
Sequel 处理表模式:
DB[:schema__table]
DB[:table.qualify(:schema)]
# SELECT * FROM schema.table
任何这不起作用的地方通常被认为是一个错误。我不确定你所说的反射是什么意思。同一个表名可以在多个模式中使用,因此一个表在哪个模式中通常是一个模棱两可的问题。
- 数据库反射:获取表列的列表,它们的数据库存储类型,也许还有适配器的抽象类型
列作为符号数组:
DB[:table].columns
# => [:col1, :col2, :col3]
架构信息:
DB.schema(:table)
# [[:col1=>{:type=>:integer, :db_type=>'int(11)', :default=>nil, ...}], ...]
:type 是 ruby 类型符号, :db_type 是数据库类型字符串。
- 能够在循环中使用其他表(插入、更新)来枚举另一个表的选择,而无需从被枚举的表中获取所有记录
我假设你要求这样的东西:
DB[:table].each do |row|
DB[:other_table].insert(:blah=>row[:blah])
end
这在 Sequel 中的某些适配器上无法正常工作,因为连接池使用相同的数据库连接进行 :other_table 上的插入,而它仍在用于 :select 表上。您可以通过使用分片支持来解决此问题:
DB = Sequel.connect(..., :servers=>{:read_only=>{}})
DB[:table].each do |row|
DB[:other_table].insert(:blah=>row[:blah])
end
在这种情况下,DB 将使用 :read_only 分片用于 :table 上的选择,使用 :default 分片用于 :other_table 上的插入。您还可以显式指定分片:
DB[:table].server(:read_only).each do |row|
DB[:other_table].server(:default).insert(:blah=>row[:blah])
end
我没有解决的问题我假设你知道 Sequel 已经处理了。当然,Sequel 可能无法满足您的所有需求,但在这种情况下,我怀疑任何其他 ruby 数据库库都可以。