2010-06-29 18 views
12

No tengo claro aún la forma correcta de ejecutar consultas SQL sin procesar con Sequel.Cómo ejecutar consultas SQL sin procesar con Sequel

Actualmente estoy tratando esto:

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

Cómo puedo puede ejecutar las consultas SQL como prima a continuación, acceder a los resultados como si fuera normal?

if @zonename.name = "UK" 

Respuesta

11

tengo algunas sugerencias que pueden ser útiles:

  1. simplemente podría hacer:

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

    NB: estás ignorando el hecho de que podría haber más resultados coincidentes el criterio. Si espera que varias filas puede volver entonces es probable que quiera construir una matriz de resultados haciendo ...

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

    y el procesamiento de todos ellos.

  2. El conjunto de devolución es un hash. Si @zonename puntos a uno de los registros, entonces pueden hacer

    @zonename[:column_name] 
    

    para referirse a un campo llamado "nombre_columna". No puede hacer @zonename.colum_nname (en realidad podría decorar @zonename con métodos de ayuda usando alguna meta-programación, pero ignorémoslo por el momento).

Sequel es una interfaz excelente, cuanto más aprenda sobre ella, más le gustará.

+0

gracias, ahora puedo progresar – veccy

12

Tenga en cuenta que en lugar de:

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

que debe hacer:

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

De lo contrario, se abre la puerta a la inyección de SQL, si usted no controla el contenido de @dialcode.

+0

¿Podría decirme qué método se llama 'fetch' debajo del capó para escapar de la entrada del usuario? Tengo una consulta compleja que se crea con muchos métodos y necesita escapar de la entrada del usuario por separado de mi llamada a la base de datos, mientras construyo la consulta. –

+0

lo siento, acabo de encontrarlo en los documentos (que estaba leyendo mientras buscaba esto, lo publicaré aquí para otros): https://github.com/jeremyevans/sequel/blob/cf1e987c1c2f7e74dca5c0f8312149bede659a21/doc/security.rdoc. El método es 'DB.literal (my_insecure_string)'. Gracias por la biblioteca Jeremy. –

Cuestiones relacionadas