Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je vérifier l'exactitude syntaxique des instructions (My)SQL

Après avoir recherché un outil CLI pour le lint de syntaxe dans Mysql à utiliser dans Jenkins et n'ayant rien trouvé rapidement (cette question Stackoverflow est l'un des premiers résultats - LOL), j'ai proposé la solution suivante (OS :Linux, mais devrait être faisable avec Windows aussi):

Quelque chose comme ce qui suit :

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

(Pour vérifier les fichiers sql, vous pouvez utiliser "

Si la syntaxe de la requête ne peut pas être analysée par mysql, elle déclare :ERREUR 1064 (42000) à la ligne 1 :Vous avez une erreur dans votre syntaxe SQL; consultez le manuel correspondant à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de '' à la ligne 1

Ce n'est que si la syntaxe est correcte qu'il essaie d'exécuter la requête et se rend compte que la table n'existe pas mais ce n'est plus intéressant :

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

Par conséquent, l'erreur 1064 est la syntaxe invalide. Il vous suffit de créer une base de données de test vide, sinon seules les erreurs avec une mauvaise partie FROM apparaîtraient (ici, par exemple, la base de données est nécessaire pour obtenir un résultat de vérification de syntaxe valide :'select asdf from s where x and if;).

Pour autant que j'ai testé, cela fonctionne bien (Version Mysql 5.5).

Voici une version complète du 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