2010-06-29 15 views
12

Nie jestem jeszcze jasny na temat prawidłowego sposobu uruchamiania surowych zapytań SQL z Sequel.Jak uruchamiać surowe zapytania SQL z Sequelem

Obecnie próbuję to:

DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") do |row| 
@zonename = row 
end 

Jak mogę uruchomić zapytań SQL jak surowego następnie uzyskać dostęp do wyników jak normalne?

if @zonename.name = "UK" 

Odpowiedz

11

Mam kilka wskazówek, które mogą okazać się przydatne:

  1. Mogłeś po prostu zrobić:

    @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).first 
    

    NB: jesteś ignorując fakt, że nie może być więcej wyników dopasowanie kryteria. Jeśli oczekujesz wiele możliwych zwracanych wierszy to prawdopodobnie chcą zbudować tablicę wyników, wykonując ...

    @zonename = DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode).all 
    

    i przetwarzanie wszystkich z nich.

  2. Zestaw zwrotu to hasz. Jeśli @zonename wskazuje na jeden z zapisów następnie można zrobić

    @zonename[:column_name] 
    

    odnieść się do pola o nazwie „column_name”. Nie możesz zrobić @zonename.colum_nname (możesz nawet udekorować @zonename metodami pomocniczymi za pomocą meta-programowania, ale zignorujmy to na razie).

Sequel to doskonały interfejs, im więcej się o nim dowiesz, tym bardziej Ci się spodoba.

+0

dziękuję, jestem w stanie robić postępy – veccy

12

Zauważ, że zamiast:

DB.fetch("SELECT * FROM zone WHERE dialcode = '#{@dialcode}' LIMIT 1") 

należy zrobić:

DB.fetch("SELECT * FROM zone WHERE dialcode = ? LIMIT 1", @dialcode) 

przeciwnym razie otwórz się na SQL injection, jeśli nie kontrolować zawartość @dialcode.

+0

Czy możesz mi powiedzieć, jaka metoda jest wywoływana przez 'pobieranie' pod maską, aby uniknąć wejścia użytkownika? Mam złożoną kwerendę, która jest zbudowany z wielu metod i trzeba uciec wejściowe użytkownika oddzielnie od wywołania bazy danych, podczas budowania kwerendy. –

+0

Niestety, znalazłem to w dokumentach (które czytałem podczas wyszukiwania tego, opublikuję to tutaj dla innych): https://github.com/jeremyevans/sequel/blob/cf1e987c1c2f7e74dca5c0f8312149bede659a21/doc/security.rdoc. Metodą jest 'DB.literal (my_insecure_string)'. Dzięki za bibliotekę Jeremy. –

Powiązane problemy