Параметризация SQL-запросов в Ruby + TinyTDS

Я пытаюсь понять, как параметризовать строку SQL, прежде чем передать ее на выполнение, но, к сожалению, я нахожу много этого в Интернете:

sql = "SELECT * FROM table_name WHERE thing LIKE '%#{input}%'"

Это плохо ... однако параметризация запросов sql доступна в базовой библиотеке Sequel. , на котором построен TinyTDS. Так что я знаю, что это возможно. Мне просто трудно это понять.

Я действительно хотел бы, чтобы это было так просто, как это:

@client = TinyTds::Client.new(
      :adapter => 'sqlserver',
      :host => host,
      :database => db,
      :username => username,
      :password => password)

sql = "SELECT * FROM table_name WHERE thing LIKE ?"
safe_sql = @client.prepare(sql, input)
result = @client.execute(safe_sql)

Кажется, я нашел что-то под названием Dataset в исходный код, в котором есть метод подготовки. Вопрос в том, как им пользоваться? Нужно ли мне создавать другой объект перед тем, как передать его методу execute() в объекте @client? Мне не удалось найти метод initialize или new, поэтому создание простого экземпляра кажется неправильным.


person Droogans    schedule 24.01.2013    source источник
comment
Доступна ли константа DB?   -  person iain    schedule 25.01.2013
comment
Собственно, глядя на это, у Sequel есть адаптер TinyTDS, так что я бы просто использовал это. Я не вижу ничего из того, что делает жемчужина TinyTDS, что вы могли бы получить не только от прямого использования Sequel.   -  person iain    schedule 25.01.2013
comment
См. этот документ о фильтрации, чтобы увидеть, что вы можете передать ввод как у вас есть выше на prepare, и это автоматически сделает ввод безопасным. См. документ для пользователей SQL, чтобы узнать, как запускать SQL напрямую.   -  person iain    schedule 25.01.2013
comment
+1 @iain. Сиквел великолепен и прекрасно поддерживает TinyTDS. Вот как бы я пошел.   -  person the Tin Man    schedule 25.01.2013


Ответы (1)


Я реализовал гем Sequel с помощью TinyTds в качестве адаптера. Это позволяет параметризовать SQL-запросы. См. Пример ниже:

require "tiny_tds"
require 'sequel' 

DB = Sequel.connect(
    adapter: 'tinytds', 
    host: "dataserver", 
    database: "database", 
    user: "username", 
    password: "password"
)

Затем я смог сделать оператор вставки SQL с параметризацией моих значений.

posts_table = DB[:posts]
posts_table.insert(:author => 'John Smith', :title => 'How to parametrize sql queries')

Я подключаюсь к базе данных MS SQL.

person Patrick_870206    schedule 13.07.2015