sql >> Databáze >  >> RDS >> Mysql

Jak mohu zkontrolovat syntaktickou správnost příkazů (My)SQL

Po hledání nástroje CLI pro syntaktické linting v Mysql pro použití v Jenkins a rychle jsem nic nenašel (tato otázka Stackoverflow je jedním z prvních výsledků - LOL) jsem přišel s následujícím řešením (OS:Linux, ale měl by být proveditelné také s Windows):

Něco jako následující:

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

(Pro kontrolu souborů sql můžete použít "

Pokud syntaxi dotazu nelze analyzovat pomocí mysql, uvádí:ERROR 1064 (42000) na řádku 1:Máte chybu v syntaxi SQL; podívejte se do manuálu, který odpovídá verzi vašeho serveru MySQL, kde najdete správnou syntaxi, která se má použít poblíž '' na řádku 1

Pouze pokud je syntaxe správná, pokusí se provést dotaz a uvědomí si, že tabulka neexistuje, ale to už není zajímavé:

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

Chyba 1064 je proto neplatná syntaxe. Musíte pouze vytvořit prázdnou testovací databázi, protože jinak by se objevily pouze chyby s chybnou částí FROM (zde je například databáze potřeba k získání platného výsledku kontroly syntaxe:'select asdf from s where x a if;).

Pokud jsem testoval, funguje dobře (verze Mysql 5.5).

Zde je kompletní verze bash skriptu:

#!/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. Kolik řádků v databázi je PŘÍLIŠ MNOHO?

  2. MySql Upravený strom předobjednávky pro vytvoření adresy URL

  3. Osvědčené postupy pro návrh vícejazyčné databáze

  4. Jak spravovat připojení DB pouze pro čtení na úrovni aplikace