2009-08-05 8 views
8

Estoy considerando usar Sequel para algunos de mis SQL más peludos que me parece demasiado difícil de crear en Active Record.¿Secuela junto con ActiveRecord cualquier atrapada?

¿Hay alguna cosa que deba tener en cuenta al usar Sequel y ActiveRecord en el mismo proyecto? (Además de los obvios como ninguna validación de AR en la secuela, etc.)

Respuesta

20

Descargo de responsabilidad: soy el mantenedor de Sequel.

Sequel es fácil de usar junto con o en lugar de ActiveRecord cuando se utilizan los rieles. Tienes que configurar la conexión de la base de datos manualmente, pero aparte de eso, el uso es similar.Los archivos de modelo de Sequel se encuentran en la aplicación/modelos y funcionan de manera similar a los modelos de ActiveRecord.

Configurar las conexiones de la base de datos no es tedioso, generalmente es una línea en environment.rb para requerir secuela, y una línea en cada archivo de entorno (development.rb, test.rb, production.rb) para hacer algo como :

DB = Sequel.connect (...)

Así que es tedioso si se tiene en cuenta 4 líneas de código de configuración tediosa.

El uso de SQL sin procesar generalmente no es un problema a menos que esté apuntando a múltiples bases de datos. La razón principal para evitarlo es la mayor verbosidad. Sequel admite el uso de SQL sin formato al menos tan fácilmente como ActiveRecord, pero los tiempos en los que necesita utilizar SQL sin formato son bastante raros en Sequel.

BTW, Sequel se envía con múltiples complementos de validación. El complemento validation_class_methods es similar a las validaciones de ActiveRecord, utilizando métodos de clase. El complemento validation_helpers tiene una implementación más simple usando métodos de nivel de instancia, pero ambos pueden hacer más o menos lo mismo.

Por último, le diré que si ya tiene un código de ActiveRecord que hace lo que desea, probablemente no valga la pena el esfuerzo de portar el código a Sequel a menos que planee agregar características.

+0

Espero no haber aparecido como anti-Sequel, por cierto: en realidad es mi opción preferida fuera de Rails. No veo mucho beneficio en el uso de las dos bibliotecas juntas, solo para obtener un poco de independencia adicional de la plataforma, incluso cuando el SQL necesario se vuelve complejo. Creo que es excesivo, especialmente si el desarrollador ya sabe lo que quiere escribir. ¡Volver a trabajar en ese tipo de SQL personalizado ciertamente no fue el problema más grande relacionado con la base de datos que tuve que enfrentar cuando tuve que hacer un puerto de MySQL a Oracle! –

+0

¿Alguna sugerencia de hack sobre cómo obtener un objeto db de continuación de una conexión de registro activa? – fotanus

3

Personalmente, no lo haría. Solo manejar la conexión más o menos a mano sería tedioso, para empezar. Estaría más inclinado, si sintiera que Sequel era la opción más fuerte, para esperar Rails 3.0 (o tal vez empezar a desarrollar contra Edge Rails) donde debería ser bastante fácil cambiar de ORM, si Yehuda y compañía están haciendo bien sus cosas . Mucho más parecido a Merb que ahora, al menos.

Esta fue la toma de DHH sobre el tema (no estoy diciendo que debería ser tomado como la verdad del Evangelio, la mente, pero es, por así decirlo, desde la boca del caballo):

Pero Isn' t Sql sucio?

Desde que los programadores comenzaron a sistemas orientados a objetos capa en la parte superior de bases de datos relacionales, que han luchaban con la cuestión de cómo profunda para ejecutar la abstracción. Algunos mapeadores relacionales de objetos buscan erradicar el uso de SQL por completo, esforzándose por la pureza orientada a objetos por forzando todas las consultas a través de otra capa OO .

Active Record does not. Fue construido sobre la noción de que SQL no es sucio ni malo, solo detallado en los casos triviales . El foco está en eliminando la necesidad de tratar con la verbosidad en esos casos triviales pero manteniendo la expresividad alrededor de consultas difíciles - el tipo SQL fue creado para tratar elegantemente.

Por lo tanto, usted no debe sentirse culpable cuando se utiliza find_by_sql() para manejar los cuellos de botella de rendimiento, ya sea o discos consultas. Comience usando la interfaz orientada a objetos para productividad y placer , y la inmersión debajo de la superficie para una experiencia cerca del metal cuando lo necesite.

(Cita se encontró here, el texto original está en P334 de AWDRWR, la "hamaca" libro).

Creo que es razonable.

¿Estamos hablando de algo que find_by_sql no puede manejar? ¿O estamos hablando de cosas complejas no SELECCIONADAS que execute no pueden tratar?

¿Alguno de los ejemplos que podríamos ver?

+0

Todas las cosas que estoy buscando ejecutar y find_by_sql y sanitize_sql_array pueden tratar. Me siento un poco incómodo al tener el código duro de SQL, lo cual es realmente extraño, ya que soy un desarrollador de SQL bastante fuerte. Me gustan las cualidades de LINQ like que la secuela parece exhibir. Pero puede que tengas razón, tal vez debería aprender a aceptar ensuciarme con SQL en una aplicación de rieles cuando el rendimiento es crítico. –

+0

Esta fue una respuesta interesante. He estado buscando opciones y esta conversación ha sido útil. – uadrive

+0

Bueno, con Sequel también puedes crear tus propias sentencias de SQL. Y no se basó en la noción de que SQL también es sucio o malo. Pero es útil en este caso porque es más modular y se puede usar más fácilmente para generar consultas que se construyen parcialmente a mano y se crean en parte con una poderosa herramienta. –

Cuestiones relacionadas