Как проверить (My) операторы SQL на синтаксическую правильность - PullRequest
17 голосов
/ 19 октября 2010

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

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

Есть идеи?

Ответы [ 4 ]

8 голосов
/ 25 апреля 2013

После поиска инструмента 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 вы можете использовать "

Если синтаксис запроса не может быть проанализирован MySQL, он заявляет: ОШИБКА 1064 (42000) в строке 1: в синтаксисе SQL имеется ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' в строке 1

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

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

Поэтому ошибка 1064 - неверный синтаксис.Вам нужно только создать пустую тестовую базу данных, потому что в противном случае будут появляться только ошибки с неправильной деталью FROM (здесь, например, база данных необходима для получения правильного результата проверки синтаксиса: 'выберите asdf из 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
5 голосов
/ 20 октября 2010

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

3 голосов
/ 19 октября 2010

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

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

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

1 голос
/ 22 декабря 2015

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

...