Domanda

stiamo attualmente la creazione di fuori server di integrazione e durante questo processo abbiamo creato pre-commit ganci sul SVN in modo che i nostri sviluppatori non possono controllare in file che sono sintatticamente valida (principalmente PHP e XML).

Abbiamo anche un gruppo di sql file (per MySQL), che mi piacerebbe pelucchi pure. Purtroppo, Google non si presentò qualcosa di utile per questo compito.

Tutte le idee?

È stato utile?

Soluzione

Il commerciale versione di MySQL Workbench ha una pedina sintassi per le dichiarazioni di MySQL, ma, naturalmente, che coprirebbe solo gli aspetti del database. Vedere http://mysql.com/products/workbench/ (anche se ho trovato il factoid nella guida indice per l'applicazione gratuita).

Altri suggerimenti

Dopo la ricerca di uno strumento per la sintassi CLI linting in MySQL per l'uso in Jenkins e non ha trovato nulla in fretta (questa domanda StackOverflow è uno dei primi risultati - LOL) mi si avvicinò con la soluzione seguente (SO: Linux, ma dovrebbe essere fattibile con Windows troppo):

Qualcosa di simile al follwoing:

lint_result=`mysql mysql_test -B -f -e 'select asdf s where x;' 2>&1`; if [ `echo $lint_result | sed -r "s/ERROR ([0-9]*).*/\1/g"` -eq 1064 ]; then echo -e "Syntax error:\n${lint_result}"; fi
Syntax error:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where x' at line 1

(per controllare i file sql che è possibile utilizzare "

Se la sintassi della query non può essere analizzato da MySQL che dice: ERRORE 1064 (42000) alla linea 1: Hai un errore nella sintassi SQL; controllare il manuale che corrisponde alla vostra versione del server MySQL per la sintassi del diritto di utilizzare vicino a '' at line 1

Solo se la sintassi è corretta si cerca di eseguire la query e rendersi conto che la tabella non esiste, ma questo non è interessante più:

ERROR 1146 (42S02) at line 1: Table 'mysql_test.s' doesn't exist

Perciò Errore 1064 è la sintassi non valida. Hai solo bisogno di creare un database di test vuoto perchè altrimenti solo gli errori con un torto DAL parte apparirebbero (qui ad esempio è necessario il database al fine di ottenere un risultato del controllo sintassi valida: 'select asdf da s dove x e se;).

Per quanto ho provato che funziona bene (versione di MySQL 5.5).

Ecco un completo vesion script bash:

#!/bin/bash

source_dir=${1};
database="mysql_test";
mysql_args="-h127.0.0.1";

mysql $mysql_args -B -e "DROP DATABASE IF EXISTS $database; CREATE DATABASE $database;";
for file in `find $source_dir -name "*.sql"`; do
    lint_result=`mysql $mysql_args $database -f -b < $file 2>&1`;
    if [ "`echo $lint_result | sed -r \"s/ERROR ([0-9]*).*/\1/g\"`" = "1064" ]; then
        echo -e "Syntax error in file ${file}:\n${lint_result}" && exit 1;
    fi;
done

Ecco un validatore , che convalida contro SQL 92/99/2003 norme tuttavia il fatto si parla conduce MySQL farmi credere che si sta utilizzando la sintassi specifica di MySQL nelle query SQL.

Una possibilità è mossa ad un approccio agnostico, nel trattare con il vostro livello di database, la scrittura di codice SQL agnostico. Sarà, ovviamente, bisogno di entrare in contatto con Mimete per vedere se si può prendere in linea e integrarlo all'interno del vostro ambiente CI.

Un paio di "se" nell'approccio globale e questo è tutto subordinato al fatto che si è disposti / grado allo stato attuale di scrivere codice SQL agnostico.

Ho scritto uno strumento CLI per file SQL controllo della sintassi utilizzando il parser phpMyAdmin SQL: php-sqllint .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top