Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę sprawdzić poprawność składniową instrukcji (My)SQL?

Po wyszukaniu narzędzia CLI do lintingu składni w Mysql do użycia w Jenkins i niczego szybko nie znalazłem (to pytanie Stackoverflow jest jednym z pierwszych wyników - LOL) wymyśliłem następujące rozwiązanie (OS:Linux, ale powinno być wykonalne również w systemie Windows):

Coś w stylu:

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

(Aby sprawdzić pliki sql, możesz użyć "

Jeśli składnia zapytania nie może być przeanalizowana przez mysql, w wierszu 1:występuje błąd:BŁĄD 1064 (42000). sprawdź instrukcję, która odpowiada Twojej wersji serwera MySQL, aby znaleźć właściwą składnię w pobliżu „” w wierszu 1

Tylko jeśli składnia jest poprawna, próbuje wykonać zapytanie i zorientować się, że tabela nie istnieje, ale to już nie jest interesujące:

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

Dlatego błąd 1064 jest nieprawidłową składnią. Wystarczy utworzyć pustą testową bazę danych, ponieważ w przeciwnym razie pojawiłyby się tylko błędy z niewłaściwą częścią FROM (tutaj na przykład baza danych jest potrzebna, aby uzyskać poprawny wynik sprawdzania składni:'wybierz asdf z s, gdzie x i jeśli;).

O ile testowałem, działa dobrze (wersja Mysql 5.5).

Oto pełna wersja skryptu 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Indeks atrybutów złożonych

  2. Inny sposób na ulepszenie zapytania SQL w celu uniknięcia unii?

  3. Czy mogę używać VARCHAR jako KLUCZA PODSTAWOWEGO?

  4. Jak przenieść, a następnie usunąć pole w MySQL

  5. Użyj relacyjnych baz danych MySQL w Debianie 5 (Lenny)