sql >> Database >  >> RDS >> Mysql

Hoe kan ik (Mijn)SQL-statements controleren op syntactische correctheid?

Na het zoeken naar een CLI-tool voor syntax-linting in Mysql om te gebruiken in Jenkins en niet snel iets gevonden (deze Stackoverflow-vraag is een van de eerste resultaten - LOL) kwam ik met de volgende oplossing (OS:Linux, maar zou moeten zijn ook mogelijk met Windows):

Iets als het volgende:

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

(Om sql-bestanden te controleren, kunt u "

Als de syntaxis van de query niet door mysql kan worden geparseerd, claimt deze:ERROR 1064 (42000) op regel 1:U hebt een fout in uw SQL-syntaxis; controleer de handleiding die overeenkomt met uw MySQL-serverversie voor de juiste syntaxis om te gebruiken in de buurt van '' op regel 1

Alleen als de syntaxis correct is, probeert het de query uit te voeren en te beseffen dat de tabel niet bestaat, maar dit is niet interessant meer:

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

Daarom is Error 1064 de ongeldige syntaxis. U hoeft alleen een lege testdatabase aan te maken omdat anders alleen fouten met een verkeerd FROM-gedeelte zouden verschijnen (hier is bijvoorbeeld de database nodig om een ​​geldig syntaxiscontroleresultaat te krijgen:'select asdf from s where x and if;).

Voor zover ik heb getest werkt het prima (versie Mysql 5.5).

Hier een complete bash-scriptversie:

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


  1. Geo-zoeken (afstand) in PHP/MySQL (prestaties)

  2. pyodbc.connect() werkt, maar niet sqlalchemy.create_engine().connect()

  3. Hoe exporteer ik een csv-bestand naar mijn computer in mysql

  4. '0000-00-00' blokkeren van MySQL-datumvelden