2009-02-04 5 views
7

Esta pregunta fue sugerida por Kyralessa en el What is your most useful sql trick to avoid writing more sql?. Tengo tantas buenas ideas para probar de la última pregunta, que estoy interesado en ver qué surge con esta pregunta.¿Qué trucos de codificación ha usado para evitar escribir más sql?

Una vez más, no estoy manteniendo la reputación de esta pregunta. Estoy esperando 7 días, para obtener respuestas, y luego marcarlo wiki. La reputación que la pregunta ha ganado se convierte en una recompensa por la pregunta.

reglas básicas:

  • Aunque sin duda es razonable para escribir código, para mover el procesamiento de SQL en el código para hacer frente a los problemas de rendimiento, que no es realmente el punto de la cuestión. La pregunta no está limitada a problemas de rendimiento. El objetivo es menos simple sql para hacer el trabajo.

  • Comunique el concepto, para que otros usuarios digan "Oh, vaya, no sabía que podría hacer eso".

  • El código de ejemplo es muy útil para ayudar a las personas que son principalmente aprendices visuales.

  • Indique explícitamente qué idioma está utilizando y qué dialecto de SQL está utilizando.

  • Ponte en el lugar de tus lectores. ¿Qué necesitarían ver allí mismo en la pantalla frente a ellos, que causará una epifanía. Su respuesta está ahí para beneficiar al lector. Escríbelo para ellos.

  • Los enlaces externos están bien, si aparecen después del ejemplo. Los enlaces externos como sustituto de una respuesta real no lo son.

Probablemente hay otras cosas para que sea más agradable para el lector que no he pensado. Se creativo. Compartir conocimientos. Diviértete presumiendo.

[EDITAR] - Parece que no ha habido ninguna actividad en un tiempo. 5 votos = 50, entonces está la recompensa, y ha sido wikificado.

+0

+1, porque es -1 en este momento y realmente no entiendo el punto en eso. Es una pregunta válida – hmcclungiii

+0

Sé que he respondido esto, pero ahora que estoy leyendo el enlace: ¿cuál es la diferencia entre esta pregunta y la relacionada? ¿Codifica trucos para escribir menos trucos SQL y SQL para escribir menos código? No importa. –

+0

Ambas son las mismas preguntas. Por favor cierra esta pregunta. – Niyaz

Respuesta

1

Donde trabajo que hemos hecho varias cosas para reducir SQL y para reducir la sobrecarga asociada de utilizar SQL en Java. (Ejecutamos Java con MSSQL, MySQL y Oracle).

El truco más útil es utilizar el método setObject de Java para los parámetros de unión. Esto, combinado con Varargs, le permite escribir un método de utilidad para ejecutar SQL:

DBUtil.execSQL(Connection con, String sql, Object... params) 

simplemente iterar sobre los parámetros y el uso statement.setObject (índice, parámetro [Índice-1]). Para nulls usas setNull(). Hemos ampliado este concepto para consultas, con un método getResultSet; el objeto ResultSet envuelto también cierra su declaración, lo que facilita la gestión de recursos.

Para reducir código SQL real escrito, tenemos un marco de construcción de consultas que le permite especificar un grupo de columnas y sus tipos y, a continuación, utilizar esta opción para especificar criterios de búsqueda automática y columnas de salida. Podemos especificar fácilmente uniones y criterios de unión y esto maneja la mayoría de los casos normales. La ventaja es que puede generar un informe en aproximadamente 10 líneas de código, incluidos diferentes parámetros de consulta, clasificación, agrupación, etc. El código es demasiado complejo para incluirlo aquí.

También he utilizado tablas all_tables y ALL_TAB_COLUMNS de Oracle para generar instrucciones SELECT; Otro truco que he utilizado es el uso de la ResultSetMetadata para analizar la tabla:

ResultSet rs = DBUtil.getResultSet(con, "SELECT * FROM " + someTable); 
ResultSetMetaData rsm = rs.getMetaData(); 

boolean first = true; 
for (int i = 1; i <= rsm.getColumnCount(); i++) { 
    String col = rsm.getColumnName(i).toUpperCase(); 
    // do something with the column name 
} 

Esto hace que sea fácil de generar ciertos tipos de declaraciones; en este caso, tenemos una tabla activa y una tabla de archivo y estamos moviendo registros de una a la otra. Sin entrar en un debate sobre el uso de una tabla de archivos, el código de Java que he escrito me permite modificar las dos tablas sin tener que modificar el script de archivo.

Otro truco que utilizamos es el uso de constantes para todos nuestros nombres de tablas y columnas. Esto hace que escribir SQL sea un poco tedioso, pero nos permite (entre otras cosas) generar SQL fácilmente para tablas con una construcción similar o idéntica. Como usamos constantes para definir los nombres de las columnas, el código realmente impone que las columnas idénticas tengan el mismo nombre. El uso de constantes también le permite buscar referencias a una columna en particular, lo que le permite examinar otras declaraciones SQL que pueden estar relacionadas con el trabajo que está realizando. Esto nos permite reutilizar SQL de otros módulos, en lugar de volver a escribir ciegamente la misma declaración de nuevo.

2

Genera SP de SQL, Vistas, etc. de los metadatos en INFORMATION_SCHEMA. Esa generación de código se puede aumentar con código personalizado.

Si un número de SP hace cosas similares, para facilitar un solo punto de mantenimiento, generaré SQL dinámico en su lugar.

Todo esto da como resultado menos código SQL y más código que se reutiliza y se prueba mejor, como cualquier biblioteca.

Here's an example of code generation to avoid writing SQL

10

Si se quiere evitar la escritura de SQL usar un ORM como NHibernate, o una de las ofertas de Microsoft LINQ a Marco SQL/Entidad

Esto es incluso mejor que el uso de un generador desde que ganaste No es necesario volver a ejecutar los generadores, y si utiliza Fluent nHibernate puede habilitar la configuración a través de Convention y ni siquiera mantener un archivo/clase de asignación.

2

Idioma: C#/VB.NET.

Actualmente puedo escribir un sistema con respaldo de DB sin escribir ningún SQL. Mi DAL usa las definiciones de clase de POJO para generar SQL sobre la marcha. Ejemplo:

SearchCriteria sc = new SearchCriteria(); 
sc.AddBinding("Customer_id", "ALFKI"); 
List<Entity> customers = SQL.Read(sc, new Customers()); 

El código anterior devolverá una lista de instancias de los clientes que emparejan CUSTOMER_ID a "ALFKI". El DAL se conecta al DB, crea el SQL, lo ejecuta, crea nuevos objetos, los completa y los envía de vuelta. Cuando haya terminado de cambiar los objetos, sólo tiene que llamar

SQL.Write(customer); 

que tienen todos los elementos modificados actualizados con el PP - que importa, sólo los que han cambiado y sólo las columnas que han cambiado.

Bonificación adicional: admite SQL Server, Oracle, Informix. El código del cliente nunca tiene que cambiar.

+0

@Marlon - no hay problema, aunque probablemente lo baje rápidamente - por alguna razón la gente parece odiar la reflexión - ¡lo que BTW NHibernate usa en todas partes! –

0

me recomiendan la creación de métodos compartidos que se centran en la tarea, y el uso de elementos SQL sencillas, sin tener que escribir SQL. Yo uso Subsonic para mi acceso de datos a MS SQL. Sin embargo, podría hacerlo no específico de la base de datos, como un DAL. Estos ejemplos se pueden personalizar a un ORM o como se acceda a los datos.Recomiendo crear una clase estática que se reduzca a una tarea específica.

Por ejemplo, si tiene una cuadrícula de datos para poblar y sabes una vista, tabla, procedimiento almacenado para poblarlo de, crear una función similar al siguiente código C#:

public static void BindDataGridViewWhere(DataGridView dgv, string tablename, string selectList, string whereClause) 
{ 
    Query qQuery = new Query(tablename); 
    qQuery.SelectList = selectList; 
    qQuery.WHERE(whereClause); 
    DataSet dsDGV = qQuery.ExecuteDataSet(); 
    dgv.DataSource = dsDGV.Tables[0]; 
    dgv.RowHeadersVisible = false; 
} 

Luego, en la página init o algo así, simple llamada de 1 línea a este método pasando la vista de tabla de datos con la instrucción where, lo que desea que aparezca y cómo en la selección, y la cláusula where y está obligado.

BindDataGridViewWhere (dgvCars, "tbl_Cars", "CarName", "Color, mdl como modelo", "Color = 'azul'");

Esto funciona muy bien para cualquier objeto con el que trabajes mucho, como dropdownboxes, listboxes, datagridviews, cualquier otra cosa. Luego, para otros que no se ajustan a este modelo, tenga un método que simplemente devuelva un conjunto de datos. De esta manera, si necesita interactuar con él antes de mostrarlo, puede hacer una lógica comercial adicional, etc.

Me gusta este enfoque porque si desea cambiar los marcos de datos, tiene 1 lugar para realizar el cambio. Puedes construir una pantalla muy rápido de esta manera.

0

He usado outlet-orm que es una solución ORM impresionante que no genera. Creo que de todos los trucos que he hecho en el pasado, este ha sido el más conveniente y el ahorro de tiempo.

0

Recomendaría SQLAlchemy si es posible que use un entorno de python.

La otra cosa que probé es escribir mi propio generador de esquema para probar nuestros sistemas en el trabajo. Esto fue más para generar diferentes combinaciones de consultas para intentar bloquear el sistema. Básicamente, he definido un pseudo deparse árbol, con los diccionarios y listas

SQLAlchemy

Esto es un fragmento de código

>>>for row in session.query(User, User.name).all(): 
... print row.User, row.name 
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users [] 
<User('ed','Ed Jones', 'f8s7ccs')> ed 
<User('wendy','Wendy Williams', 'foobar')> wendy 
<User('mary','Mary Contrary', 'xxg527')> mary 
<User('fred','Fred Flinstone', 'blah')> fred 
2

Rodé mi propia ORL (Object-Relational Mapper) en PHP para MySQL. Realmente simplifica todo lo que tiene que ver con el cambio de la base de datos, y funciona muy bien para situaciones simples.

Consiste en una clase base de la que puede heredar. Subclase fácilmente:

<?php 
class CSomething extends CDatabaseObject 
{ 

} 

// create a new Something 
$oSomething = new CSomething(); 
$oSomething->somevariable = 'blah'; 
$oSomething->Save(); 

// fetch an old Something by primary key 
$oSomething = new CSomething(1); 
// .. and delete it 
$oSomething->Delete(); 
?> 

Se figuras automáticamente los índices de la tabla, y la clave principal. Si es necesario, puedes decirle a la clase estas cosas si hace algo malo.

Puede realizar búsquedas básicas especificando la cláusula WHERE del SQL (para que no sea completamente libre de SQL). Ya que habla sobre los tipos de datos de los campos, las consultas parametrizadas son simples.

Por supuesto, no puede hacer todo lo que necesito, pero ahorra mucho tiempo de desarrollo y código.

1

En uno de mis proyectos, uso un metamodelo (tablas, columnas, relaciones) que agrega información a las vistas sys * incorporadas.

Parte de los datos en mi metamodelo se usa para generar activadores de registro para insertar/actualizar/eliminar, y para implementar eliminaciones en cascada en el lugar de eliminar activadores. Con aprox.100 tablas el código generado para estos desencadenantes es de aproximadamente 12,000 líneas de código TSQL.

Un SP genera una estructura de datos C# que compara el esquema de la base de datos en vivo con mi esquema de base de datos de desarrollo para asegurarse de que las actualizaciones funcionaron correctamente.

Recientemente, el metamodelo incluso me permitió generar código C# para la validación de eliminación (es decir, no puede eliminar el registro si existen registros dependientes) en formularios Asp.Net basados ​​en FormView.

0

Uso de las características de .NET, como las columnas de expresión (VB ejemplo mostrado) a los datos se unen varias columnas que se mostrará a la vez:

ds.Tables(0).Columns.Add(
    New DataColumn("CustomDescription", GetType(String), 
        "LastName + ', ' + FirstName + ' - ' + 
        WorkEmail")) 
ResultsListBox.DataSource = ds 
ResultsListBox.DataTextField = "CustomDescription" 
ResultsListBox.DataValueField = "EmployeeID" 
ResultsListBox.DataBind() 
0

No hay nada malo con SQL. Usa la herramienta correcta para el trabajo correcto.

Cuestiones relacionadas