sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg kontrollere (Min)SQL-sætninger for syntaktisk korrekthed

Efter at have søgt efter et CLI-værktøj til syntax linting i Mysql til brug i Jenkins og ikke fandt noget hurtigt (dette Stackoverflow-spørgsmål er et af de første resultater - LOL) kom jeg frem til følgende løsning (OS:Linux, men burde være også muligt med Windows):

Noget i stil med følgende:

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

(For at kontrollere sql-filer kan du bruge "

Hvis syntaksen for forespørgslen ikke kan parses af mysql, hævder den:FEJL 1064 (42000) på linje 1:Du har en fejl i din SQL-syntaks; tjek manualen, der svarer til din MySQL-serverversion for den rigtige syntaks, der skal bruges nær '' på linje 1

Kun hvis syntaksen er korrekt, forsøger den at udføre forespørgslen og indse, at tabellen ikke eksisterer, men det er ikke interessant længere:

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

Derfor er fejl 1064 den ugyldige syntaks. Du behøver kun at oprette en tom testdatabase, da der ellers kun dukker fejl med en forkert FROM-del (her er databasen f.eks. nødvendig for at få et gyldigt syntakstjekresultat:'vælg asdf fra s hvor x og hvis;).

Så vidt jeg har testet virker det fint (version Mysql 5.5).

Her er en komplet bash-script-version:

#!/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. Sådan fungerer SQRT() i MariaDB

  2. Trin for trin opgraderingsproces for R12.2 Upgrade Part -1

  3. Meget vedvarende /opt/lampp/bin/mysql.server:264:kill:Ingen sådan proces. Xampp/ubuntu 16.04

  4. Guide til designdatabase til RBAC i MySQL