sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag kontrollera (Mina)SQL-satser för syntaktisk korrekthet

Efter att ha sökt efter ett CLI-verktyg för syntax linting i Mysql att använda i Jenkins och inte hittade något snabbt (denna Stackoverflow-fråga är ett av de första resultaten - LOL) kom jag på följande lösning (OS:Linux, men borde vara möjligt med Windows också):

Något i stil med följande:

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

(För att kontrollera sql-filer kan du använda "

Om syntaxen för frågan inte kan analyseras av mysql hävdar den:ERROR 1064 (42000) på rad 1:Du har ett fel i din SQL-syntax; kontrollera manualen som motsvarar din MySQL-serverversion för rätt syntax att använda nära '' på rad 1

Bara om syntaxen är korrekt försöker den köra frågan och inse att tabellen inte existerar men det här är inte intressant längre:

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

Därför är fel 1064 den ogiltiga syntaxen. Du behöver bara skapa en tom testdatabas eftersom annars bara fel med fel FROM-del dyker upp (här behövs till exempel databasen för att få ett giltigt syntaxkontrollresultat:'välj asdf från s där x och if;).

Så långt jag testat fungerar det bra (Version Mysql 5.5).

Här en komplett 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. PostgreSQL:s date_trunc i mySQL

  2. Flera uppdateringar i MySQL

  3. Kan inte ansluta till postgres från fjärrvärden

  4. MAA-dokumentation för Oracle Cloud