2015-11-05 4 views
0

Я пишу сценарий, который экспортирует результаты в базу данных SQLite. Я не могу заставить код работать, когда я использую переменные.Вставка базы данных SQLite3 с использованием переменных

Вот отрывок:

require 'sqlite3' 
require 'shodan' 

table_name = "#{Date.today.strftime("%B")}#{Time.now.year}_Findings" 
db = SQLite3::Database.new "shodan_test.db" 
db.execute ("CREATE TABLE #{table_name} (ip string , ports string)") 

results = api.host(target) 

ip = results["ip_str"].to_s 
ports = results["ports"].to_s 

db.execute ("insert into #{table_name} (ip, ports) values (#{ip}, #{ports})") 

код не в последней строке. Я могу удалить переменные и код работает. Я немного смущен, так как CREATE TABLE работает с переменной.

+0

Когда вы говорите: «Невозможно заставить код работать» и «Код не работает», мы ожидаем, что будет какое-то сообщение о состоянии или ошибке или, по крайней мере, более описательное утверждение о * why * it doesn Не работай. Трудно сказать, что проблема без них. Измените свой вопрос и добавьте эту информацию, как если бы вы ее первоначально включили. Это помогает нам помочь вам. –

+0

Я бы рекомендовал прочитать о [Продолжение] (http://sequel.jeremyevans.net). Это намного лучше, чем непосредственно писать в SQLite API в качестве ORM, который Sequel представляет, абстрагирует ваш код, ориентированный на DBM, на более общий код, что значительно облегчает переход к альтернативным типам баз данных. –

ответ

1

Ваша проблема в том, что вы не цитируете свои строки. В результате SQLite видит такие вещи, как

insert into ... values (192.168.0.6, whatever is in ports) 

и это недопустимо SQL.

SQLite3::Database#execute понимает заполнители, так что вы должны использовать их:

db.execute("insert into #{table_name} (ip, ports) values (?, ?)", ip, ports) 

Заполнители (?) в запросе будут заменены цитироваться и спасся версии своих значений. Использование заполнителей позволяет избежать всех обычных проблем цитирования и впрыска, которые могут вызвать интерполяцию строк для SQL.

Также обратите внимание, что я удалил пространство между execute и (. Если вы помещаете туда пробел, Ruby думает, что ваш «метод вызова круглых скобок» на самом деле является «скобкой группировки выражений», и он будет жаловаться на то, что не понимает, что делают эти запятые. Если вы передаете только один аргумент (например, db.execute ("CREATE ...")), это не имеет значения, потому что круглые скобки эффективно игнорируются, но имеет значение, когда есть несколько аргументов. В любом случае o.m (arg) - это плохая привычка входить, вы должны сказать o.m(arg) или оставить круглые скобки.

+1

Именно так должен выглядеть ответ :) –

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