私は Sequel の主任開発者なので、この回答は明らかに偏っていますが、あなたが望むすべてを実行する ruby データベース ライブラリを私は知りません。
あなたの要望のいくつかは、Sequel で制限されていると認識されているようです。そのうちのいくつかは対処できます。
- フィールドマッピングなしの生の値の選択: 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 を提供する新しいデータセット メソッドを追加するのは簡単です。
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 は :table の選択に :read_only シャードを使用し、:other_table の挿入に :default シャードを使用します。シャードを明示的に指定することもできます:
DB[:table].server(:read_only).each do |row|
DB[:other_table].server(:default).insert(:blah=>row[:blah])
end
私が対処しなかった点は、Sequel が既に処理していることをご存知だと思います。そして、Sequel がすべてのニーズを満たしていない可能性は確かにありますが、その場合、他の Ruby データベース ライブラリが満たすとは思えません。