我是Sequel的首席開發人員,所以這個迴應顯然是有偏見的,但我沒有意識到任何你想做的任何Ruby數據庫庫。
看來某些你的慾望被認爲在續集的限制,其中的一些可被尋址:
- 原始值選擇而不字段映射:SELECT COL1,COL2,COL3 => [VAL1,val2的, VAL3]不湊{: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˚F或以上:
DB[:table].bfilter([:col1, :col2, :col3], [1, 2, 3])
- 能夠通過列的列表/被選擇的值:選擇(array_of_columns)(未:數據集。在一致
array_of_columns = [:col1, :col2, :col3]
DB[:table].select(*array_of_columns)
# SELECT col1, col2, col3 FROM table
- API考慮到表模式 'some_schema.some_table'(:選擇(:COL1,:COL2,:COL3),這要求列已知)
嘗試和工作)的方式;也正因爲這個反射(得到表模式)
續集涉及表模式:
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是數據庫類型字符串
- 能夠在一個循環從另一個表列舉選擇其他表(INSERT,UPDATE)的工作,而不需要來從表中的所有記錄被枚舉
我假設你所要求的東西,像這樣的:
DB[:table].each do |row|
DB[:other_table].insert(:blah=>row[:blah])
end
這並不正確地在續集一些適配器由於連接池使用在插入相同的數據庫連接工作:other_table而仍在使用的是:選擇上表。您可以解決此通過分片支持:
DB = Sequel.connect(..., :servers=>{:read_only=>{}})
DB[:table].each do |row|
DB[:other_table].insert(:blah=>row[:blah])
end
在這種情況下,DB將使用:READ_ONLY碎片的選擇上:表和:默認碎片上插入:other_table。您也可以明確指定碎片:
DB[:table].server(:read_only).each do |row|
DB[:other_table].server(:default).insert(:blah=>row[:blah])
end
我並沒有解決我想你知道,續集已經處理點。 Sequel並不能滿足你的所有需求,但在這種情況下,我懷疑任何其他Ruby數據庫庫都會如此。