2010-05-31 5 views
3

Каковы базы данных абстракции/адаптеры, используемые в Ruby? Меня в основном интересуют функции, ориентированные на данные, а не те, которые имеют сопоставление объектов (например, активная запись или сопоставление данных).Абстракции/адаптеры базы данных для ruby ​​

В настоящее время я использую Sequel. Есть ли другие варианты?

Я в основном заинтересованы в:

  • простой, чистый и не неоднозначным API
  • выбора данных (очевидно), фильтрация и агрегация
  • Выбор необработанное значение без отображения поля: SELECT col1 , col2, col3 => [val1, val2, val3] не hash из {: col1 => val1 ...}
  • может передавать список столбцов/значений, которые нужно выбрать: select (array_of_columns) (not: dataatets) .select (: col1,: col2,: col3), который требует, чтобы столбцы известны)
  • API учитывает схемы таблиц «some_schema.some_table» последовательным (и рабочим) способом; также отражение для этого (получить схему из таблицы)
  • отражение базы данных: получить список столбцов таблицы, их типов хранения базы данных и, возможно, отведенных типов адаптера
  • создания таблицы, удаление
  • иметь возможность работать с другими таблицами (вставка , обновление) в цикле перечисляющем выбор из другой таблицы, не требуя, чтобы извлечь все записи из таблицы, к которой перечислено

цели состоит в том, чтобы манипулировать данные с неизвестной структуры во время написания кода, который является противоположным объект отображение структуры или большей части строки Обычно он хорошо известен. Мне не нужны служебные данные для сопоставления объектов.

Каковы варианты, в том числе обратные для библиотек объектов?

ответ

5

Я ведущий разработчик Sequel, поэтому этот ответ явно предвзято, но я не знаю никакой библиотеки баз данных ruby, которая делает все, что вы хотите.

Оказывается, что некоторые из ваших желаний воспринимаются ограничения в Sequel, некоторые из которых могут быть решены:

выбор
  • исходное значение без отображения поля: SELECT col1, col2, COL3 => [val1, val2, val3] не хэш {: col1 => знач1 ...}

Try:

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]) 
  • быть в состоянии передать список столбцов/значения должны быть выбраны: выберите (array_of_columns) (не: набор данных.выберите (: col1, col2:,: COL3), который требует, чтобы столбцы известны)

Try:

array_of_columns = [:col1, :col2, :col3] 
DB[:table].select(*array_of_columns) 
# SELECT col1, col2, col3 FROM table 
  • API учитывает таблиц схемы 'some_schema.some_table' в последовательном (и рабочий) путь; также отражение для этого (получить схему из таблицы)

сиквел сделки с настольными схемами:

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 в то время как он по-прежнему используется для: выбора на стол. Вы можете обойти это, используя поддержку шардинге:

DB = Sequel.connect(..., :servers=>{:read_only=>{}}) 
DB[:table].each do |row| 
    DB[:other_table].insert(:blah=>row[:blah]) 
end 

В этом случае БД будет использовать: READ_ONLY осколок для выбора на: стол и: по умолчанию осколка для вставки на: other_table. Можно также указать, черепки в явном виде:

DB[:table].server(:read_only).each do |row| 
    DB[:other_table].server(:default).insert(:blah=>row[:blah]) 
end 

Точки я не обсуждаю, я полагаю, вы знаете, что сиквел уже обрабатывает. И, безусловно, возможно, что Sequel не отвечает всем вашим потребностям, хотя в этом случае я сомневаюсь, что любая другая библиотека базы данных Ruby будет.

Смежные вопросы