Cómo analizar/tokenizar una declaración SQL en Node.js
parsing tokenize (4)
Estoy buscando una manera de analizar / tokenizar la declaración SQL dentro de una aplicación Node.js, con el fin de:
- Tokenize todas las palabras clave de SQL "básicas" definidas en el estándar ISO / IEC 9075 o here .
- Valide la sintaxis de SQL.
- Averigüe qué va a hacer la consulta (por ejemplo, ¿leer o escribir?).
¿Tiene alguna solución o asesora a gente?
Vinculado: Cualquier biblioteca de Javascript / Jquery ¿Para validar la declaración de SQL?
He investigado y descubrí algunas maneras de hacerlo:
Usando las bibliotecas existentes de node.js
Hice una búsqueda en Google y no encontré una biblioteca consensual y popular para usar. Encontré esos:
- simple-sql-parser (22 estrellas en github , 16 descargas diarias en npm )
- Solo admite SELECCIONAR, INSERTAR, ACTUALIZAR y BORRAR
- Hay una rama v2 en la carretera.
- sql-parser (90 estrellas en sql-parser , 6 descargas diarias en npm )
- Solo soporta sentencias SELECT básicas
- Basado en jison
- sqljs (17 estrellas en sqljs , 5 descargas diarias en npm )
- v0.0.0-3, en desarrollo ... No hay documentación en absoluto :)
Desafortunadamente, ninguna de esas bibliotecas parece ser completa y confiable.
Hacerlo yo mismo basado en una biblioteca de tokenizer de bajo nivel node.js
Puedo hacerlo yo mismo con una biblioteca de tokenizer de bajo nivel como:
- jison (1,457 estrellas en github , 240 descargas diarias en npm )
- tokenizer (44 estrellas en github , 10 descargas diarias en npm )
Haciéndolo yo mismo basado en el codificador de código Javascript existente
here es una biblioteca de JavaScript bastante interesante (del lado del navegador) que puede reconocer palabras clave SQL, cadenas, etc. Verifique la demo .
Puedo construir un tokenizer de biblioteca node.js basado en CodeMirror. El modo SQL está aquí en github , tal vez pueda adaptarlo para obtener tokens dentro de una aplicación de nodo.
PD: here tiene 5,046 estrellas en github y está bien mantenido.
Me di cuenta de que hay 2 problemas distintos: Tokenización y validación de sintaxis (que está relacionada con la tokenización).
Me hice un tokenizador SQL para Node.js basado en el modo SQL del excelente here (5,046 estrellas en github, bien mantenido). El modo SQL de CodeMirror se encarga de SQL "genérico" y algunas particularidades de SQL como MSSQL , simple-sql-parser , github , npm , Hive y MariaDB .
Cuando mi proyecto sea lo suficientemente maduro, lo pondré (probablemente) en público en GitHub y te lo haré saber.
Acerca de la validación de sintaxis SQL , no encontré ninguna herramienta JavaScript (o proyecto de código abierto para adaptar en JS) todavía ...
Buena suerte.
No mencionó qué SQL, pero la mayoría de los lenguajes SQL de producción son enormes (consulte PL / SQL ignorando la parte de Ada), complicados y no iguales, por lo que también tendrá que preocuparse por las variantes de dialecto. Se enfrenta a la construcción de un extremo delantero completo de SQL para hacer lo que quiere; Lo incompleto de otros analizadores que encontraste es una pista sobre el nivel de esfuerzo que se necesita para hacer esto.
Después de obtener la parte correcta del analizador , tendrá que hacer una tabla de símbolos y un análisis de tipo (significado de cada símbolo) antes de poder comenzar a descubrir qué lee o escribe una consulta SQL (considere la determinación de las columnas leídas por SELECT * en .. ...).
Entiendo que hay analizadores de SQL comerciales por ahí. Podrías considerar usar uno de esos.
Puede consultar el analizador de JavaScript SQLite / WebSQL y el archivo de gramática Jison, que se puede usar para la herramienta de verificación.
Ahora admite la sintaxis completa de SQLite / WebSQL, y se puede modificar para otra sintaxis de SQL.
Recientemente publiqué el paquete sql-ast
, que analiza los scripts SQL y devuelve una matriz de nodos AST. (No pude encontrar nada similar que se mantenga)
Es muy limitado por el momento. Solo he implementado lo que necesito de él. Si tiene tiempo, por favor contribuya . He intentado hacer que el código base sea comprensible.
Dale una estrella si estás interesado en verla más desarrollada. Actualizaré esta respuesta a medida que se mejore la biblioteca.
Si desea desarrollar su propio analizador de SQL, le recomendaré un analizador de diseño PEG. He utilizado un analizador PEG para un lenguaje compile-to-js / compile-to-c, y resultó en un código mucho más claro y fácil de mantener. Compruebe: https://github.com/luciotato/LiteScript
Puede comenzar desde el analizador LiteScript si: a) este analizador es una parte importante de su aplicación, b) eventualmente necesitará un análisis de velocidad nativa.
Pero si esto no es una parte importante de la aplicación que está desarrollando, contribuir a un analizador de SQL específico existente podría ser la mejor opción.