Как я могу проверить (My) SQL-инструкции для синтаксической корректности

В настоящее время мы настраиваем сервер интеграции, и в ходе этого процесса мы настроили привязки pre-commit на SVN, чтобы наши разработчики не могли проверить файлы, которые являются синтаксически недействительными (в первую очередь PHP и XML).

У нас также есть куча файлов .sql(для MySQL), которые я хотел бы использовать. К сожалению, Google не добавил ничего полезного для этой задачи.

Любые идеи?

Ответы

Ответ 1

коммерческая версия MySQL Workbench имеет синтаксическую проверку для операторов MySQL, но, разумеется, она будет охватывать только аспекты базы данных. См. http://mysql.com/products/workbench/ (хотя я нашел factoid в индексе справки для бесплатного приложения).

Ответ 2

После поиска инструмента CLI для синтаксического литирования в 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 файлы, вы можете использовать "< filename.sql" вместо -b -e 'statement')

Если синтаксис запроса не может быть проанализирован mysql, он утверждает: ERROR 1064 (42000) в строке 1: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' в строке 1

Только если синтаксис верен, он пытается выполнить запрос и понимает, что таблица не существует, но это уже не интересно:

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

Для этого ошибка 1064 - это недопустимый синтаксис. Вам нужно создать пустую тестовую базу данных, потому что в противном случае появятся ошибки с неправильной частью FROM (здесь, например, база данных необходима для получения корректного результата проверки синтаксиса: "выберите asdf from s где x и if;).

Насколько я тестировал, он отлично работает (Version Mysql 5.5).

Здесь полный bash script vesion:

#!/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

Ответ 3

Вот validator, который проверяет стандарты SQL 92/99/2003, однако тот факт, что вы упоминаете MySQL, заставляет меня поверить вам используют SQL-специфический синтаксис в ваших SQL-запросах.

Один из вариантов - переход к агностическому подходу при работе с вашим уровнем базы данных, написание агностического кода SQL. Вам, очевидно, нужно будет связаться с Mimer, чтобы узнать, можете ли вы отключить его и интегрировать в среду CI.

Пара "ifs" в общем подходе, и все это зависит от того, хотите ли вы/умеете в текущем состоянии писать агностический код SQL.

Ответ 4

Я написал инструмент CLI для синтаксического тестирования файлов SQL с помощью парсера phpMyAdmin SQL: php-sqllint.