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

StackOverflow https://stackoverflow.com/questions/3970643

  •  09-10-2019
  •  | 
  •  

Вопрос

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

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

Любые идеи?

Это было полезно?

Решение

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

Другие советы

После поиска инструмента CLI для синтаксиса подсказывания в MySQL для использования в Jenkins и не нашел ничего быстро (этот вопрос Stackoverflow является одним из первых результатов - LOL) Я придумал следующее решение (OS: Linux, но должно быть Это тоже осуществимо с окнами):

Что-то вроде фоллеза:

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 'astrue')

Если синтаксис запроса не может быть проанализирован MySQL IT: ошибка 1064 (42000) в строке 1: у вас есть ошибка в синтаксисе SQL; Проверьте руководство, которое соответствует вашей версии MySQL Server для правильного синтаксиса для использования рядом с «на линии 1»

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

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

Там ошибка 1064 - неверный синтаксис. Вам нужно только создать пустую тестовую базу данных, потому что в противном случае появится только ошибки с неправильным от деталей (здесь, например, база данных, чтобы получить допустимый результат проверки синтаксиса: «Выберите ASDF из S, где x и если;).

Насколько я проверил, он работает нормально (версия 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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top