Mysql
 sql >> база данни >  >> RDS >> Mysql

Как мога да проверя (My)SQL изразите за синтактична коректност

След като потърсих CLI инструмент за синтаксис linting в Mysql, който да използвам в Jenkins и не намерих нищо бързо (този въпрос на Stackoverflow е един от първите резултати - LOL), стигнах до следното решение (ОС:Linux, но трябва да бъде възможно и с Windows):

Нещо като следното:

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

(За да проверите sql файловете, можете да използвате "

Ако синтаксисът на заявката не може да бъде анализиран от mysql, той твърди:ГРЕШКА 1064 (42000) на ред 1:Имате грешка във вашия SQL синтаксис; проверете ръководството, което съответства на версията на вашия MySQL сървър за правилния синтаксис, който да използвате близо до '' на ред 1

Само ако синтаксисът е правилен, той се опитва да изпълни заявката и разбира, че таблицата не съществува, но това вече не е интересно:

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

Поради това грешка 1064 е невалиден синтаксис. Трябва само да създадете празна тестова база данни, защото в противен случай ще се появят само грешки с грешна FROM част (тук например базата данни е необходима, за да получите валиден резултат от проверка на синтаксиса:'select asdf from s, където x и if;).

Доколкото тествах, работи добре (Версия Mysql 5.5).

Ето пълна версия на 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. Недостатъци на цитирането на цели числа в Mysql заявка?

  2. проверете за дублиран запис срещу резултат за използване на PDO errorInfo

  3. Къде трябва да съхранявам идентификационните данни на моята база данни?

  4. InnoDB Таблицата е пълна грешка

  5. Как да върнете масив, докато използвате GROUP BY