С Ruby ActiveRecord или Sequel вы можете постепенно создавать SQL-запросы, добавляя where
или join
или order
предложения к запросу в зависимости от условий во время выполнения.
Вот простой пример, взятый из ASCIIcasts:
def index
@articles = Article.order('name')
if params[:hidden]
@articles = @articles.where(:hidden =>(params[:hidden] == "1"))
end
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @articles }
end
end
В примере показано, как предложение WHERE может быть добавлено к базовому SQL-запросу в таблице articles
, если параметр запроса HTTP-запроса с именем hidden
равен 1
.
Я смотрел HDBC и postgresql-простой в Haskell. Кажется, что postgresql-simple преднамеренно затрудняет сбор SQL-запросов из динамически конкатенированных частей, чтобы предотвратить SQL-инъекцию. HDBC кажется достаточно гибким, чтобы создавать разные структурированные SQL-запросы на основе условий во время выполнения, но, похоже, не обеспечивает уровень абстракции, который предоставляет либо ActiveRecord, либо Sequel.
Может ли кто-нибудь предложить хороший способ эмуляции динамических объектов для создания запросов ActiveRecord с использованием одной из библиотек баз данных Haskell?
Если HDBC - это путь, я в порядке. Но иллюстрация будет оценена.
Я предполагаю, что я ищу, это способность динамически составлять запросы против бэкэнда PostgreSQL.