2010-05-31 89 views
3

您在Ruby中使用的數據庫抽象/適配器是什麼?我主要關注面向數據的功能,而不是那些使用對象映射的功能(如活動記錄或數據映射器)。ruby​​的數據庫抽象/適配器

我目前使用Sequel。還有其他選擇嗎?

我最感興趣:

  • 簡單,乾淨和非模糊API
  • 數據選擇(明顯),過濾和聚集
  • 原始值選擇而不字段映射:SELECT COL1 ,col2,col3 => [val1,val2,val3]不是{:col1 => val1的散列...}
  • 能夠傳遞要選擇的列/值列表:select(array_of_columns)(not:dataset .select(:col1,:col2,:col3)需要列已知)
  • API以一致(和工作)的方式考慮表格模式'some_schema.some_table';也正因爲這個反射(得到表模式)
  • 數據庫反射:讓表列,他們的數據庫存儲類型,也許適配器的抽象類型
  • 表創建的列表,刪除
  • 能夠與其他表的工作(插入,在一個循環中從另一個表中列舉的選擇,而不需要對取從表中所有記錄更新)被枚舉

目的是在編寫代碼的時間,這是相反的,以對象與未知結構來操作數據映射結構或大部分str通常是衆所周知的。我不需要對象映射開銷。

有什麼選擇,包括對象映射庫的後端?

回答

5

我是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數據庫庫都會如此。