2010-06-29 18 views
12

Non sono ancora chiaro sul modo corretto di eseguire query SQL non elaborate con Sequel.Come eseguire query SQL non elaborate con Sequel

Attualmente sto cercando questo:

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

Come posso possibile eseguire le query come SQL prime poi accedere ai risultati, come normale?

if @zonename.name = "UK" 

risposta

11

Ho un paio di indicatori che possono essere utili:

  1. si può semplicemente fare:

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

    NB: si sta ignorando il fatto che ci potrebbero essere più risultati corrispondenti il criterio. Se vi aspettate più possibili righe da restituire allora probabilmente vuole costruire una serie di risultati facendo ...

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

    e l'elaborazione di tutti loro.

  2. Il set di ritorno è un hash. Se @zonename punti a uno dei record, allora si può fare

    @zonename[:column_name] 
    

    per riferirsi ad un campo chiamato "nome_colonna". Non puoi fare @zonename.colum_nname (potresti effettivamente decorare lo @zonename con metodi di supporto usando qualche meta-programmazione ma ignoriamolo per il momento).

Sequel è un'interfaccia eccellente, più ne impari più ti piacerà.

+0

grazie, sono in grado di avanzare ora – veccy

12

Nota che invece di:

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

si dovrebbe fare:

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

In caso contrario, vi aprite a SQL injection, se non si controlla il contenuto di @dialcode.

+0

Potrebbe dirmi quale metodo viene chiamato da 'fetch' sotto il cofano per sfuggire all'input dell'utente? Ho una query complessa che viene creata con molti metodi e che deve sfuggire all'input dell'utente separatamente dalla chiamata al database, mentre si crea la query. –

+0

scusate, l'ho appena trovato nei documenti (che stavo leggendo mentre lo cercavo, lo pubblicheremo qui per altri): https://github.com/jeremyevans/sequel/blob/cf1e987c1c2f7e74dca5c0f8312149bede659a21/doc/security.rdoc. Il metodo è 'DB.literal (my_insecure_string)'. Grazie per la biblioteca Jeremy. –

Problemi correlati