3

Ruby で使用しているデータベースの抽象化/アダプターは何ですか? 私は主にデータ指向の機能に興味がありますが、オブジェクト マッピング (アクティブ レコードやデータ マッパーなど) には興味がありません。

現在Sequelを使用しています。他のオプションはありますか?

私は主に興味があります:

  • シンプルでクリーンで曖昧でない API
  • データの選択 (当然)、フィルタリング、集計
  • フィールドマッピングなしの生の値の選択: SELECT col1, col2, col3 => [val1, val2, val3] { :col1 => val1 ...} のハッシュではありません
  • 選択する列/値のリストを渡すことができます: select(array_of_columns) (列が既知である必要がある dataset.select(:col1, :col2, :col3) ではありません)
  • API は、テーブル スキーマ 'some_schema.some_table' を一貫した (そして機能する) 方法で考慮します。これも反映(テーブルからスキーマを取得)
  • データベース リフレクション: テーブル列、それらのデータベース ストレージ タイプ、およびおそらくアダプターの抽象化タイプのリストを取得します
  • テーブルの作成、削除
  • 列挙されているテーブルからすべてのレコードをフェッチする必要なく、別のテーブルからの選択を列挙するループで他のテーブルを操作 (挿入、更新) できる

目的は、コードの記述時に未知の構造を持つデータを操作することです。これは、構造または構造の大部分が通常よく知られているオブジェクト マッピングとは逆です。オブジェクト マッピングのオーバーヘッドは必要ありません。

オブジェクト マッピング ライブラリのバックエンドを含め、どのようなオプションがありますか?

4

1 に答える 1

5

私は 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 データベース ライブラリが満たすとは思えません。

于 2010-06-01T17:15:38.803 に答える