Question

nous met actuellement en place sur le serveur d'intégration et pendant ce processus, nous avons mis en place avant de commettre des crochets sur le SVN afin que nos développeurs ne peuvent pas vérifier dans les fichiers qui sont syntaxiquement invalides (principalement PHP et XML).

Nous avons aussi un groupe de fichiers .sql (pour MySQL) que je voudrais pelucheux. Malheureusement, Google ne se est pas quelque chose d'utile pour cette tâche.

Toutes les idées?

Était-ce utile?

La solution

commerciale Version de MySQL Workbench a un vérificateur de syntaxe pour les états MySQL, mais bien sûr cela ne couvrirait les aspects de base de données. Voir http://mysql.com/products/workbench/ (bien que je trouve le factoid dans l'aide index pour l'application gratuite).

Autres conseils

Après la recherche d'un outil CLI pour effilochage de syntaxe Mysql à utiliser dans Jenkins et n'a rien trouvé rapidement (cette question Stackoverflow est l'un des premiers résultats - LOL) je suis venu avec la solution suivante (OS: Linux, mais devrait être possible avec Windows aussi):

Quelque chose comme le 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

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

Si la syntaxe de la requête ne peut pas être analysé par mysql il affirme: ERREUR 1064 (42000) à la ligne 1: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près « » à la ligne 1

Seulement si la syntaxe est correcte, il tente d'exécuter la requête et se rendre compte que la table n'existe pas, mais ce n'est pas intéressant plus:

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

Erreur 1064 est ainsi tous la syntaxe non valide. Il vous suffit de créer une base de données de test vide car sinon seules les erreurs avec une mauvaise clause FROM apparaîtraient (ici par exemple la base de données est nécessaire afin d'obtenir un résultat de la vérification de syntaxe valide: « select asdf de s où x et si;).

En ce qui je l'ai testé fonctionne très bien (version 5.5 Mysql).

Voici un script bash complet vesion:

#!/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

Voici un validateur , qui valide contre SQL 92/99/2003 normes cependant le fait que vous me mentionner conduit MySQL à croire que vous utilisez la syntaxe spécifique de MySQL dans vos requêtes SQL.

L'une des options est passer à une approche agnostique dans le traitement de votre couche de base de données, l'écriture agnostique code SQL. Vous aurez évidemment besoin d'entrer en contact avec Mimer pour voir si vous pouvez le prendre hors ligne et l'intégrer dans votre environnement de CI.

Couple de « si » dans l'approche globale et cela est subordonné au fait que vous êtes prêt / mesure dans l'état actuel d'écrire agnostique code SQL.

J'ai écrit un outil CLI de vérification de syntaxe des fichiers SQL en utilisant l'analyseur SQL phpMyAdmin: php-sqllint .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top