Как проверить синтаксис SQL в файле .sql? - PullRequest
23 голосов
/ 05 июня 2009

Как проверить синтаксис SQL в файле .sql?

Ответы [ 7 ]

5 голосов
/ 06 июня 2009

Базовый лексер, кажется, реализован в sql / sql_lex.cc. Вы можете использовать / спасать это, чтобы создать свой собственный тестовый парсер. Но это будет проверять только синтаксис, но не ошибки во время выполнения.

edit: Для MySQL 8.0+ см. Как проверить синтаксис SQL в файле .sql?

3 голосов
/ 04 мая 2016

TLDR:

>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"

Как ни странно, в mysql для этого нет встроенного переключателя, но вы можете проверить синтаксис, добавив оператор EXPLAIN перед вашими запросами.

Если у вас есть файл statements.sql с каждым оператором в одной строке, добавьте перед всеми строками EXPLAIN:

>awk '{print "EXPLAIN " $0}' statements.sql > check.sql

Затем вы можете запустить операторы с помощью инструмента командной строки mysql и использовать --force, чтобы продолжить его при ошибке. Он выведет ошибку для любых операторов с неправильным синтаксисом.

>mysql --force -u user -p database < check.sql

Или только для просмотра строк с ошибками:

>mysql --force -u user -p database < check.sql | grep "ERROR"

Вы можете сделать все это в одной строке, не создавая промежуточный файл:

>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"
2 голосов
/ 07 апреля 2018

SELECT STATEMENT_DIGEST_TEXT в MySQL 8.0 может использоваться для проверки синтаксиса запроса MySQL.

8.0.4>SELECT STATEMENT_DIGEST_TEXT('FLUSH TABLES')\G
STATEMENT_DIGEST_TEXT('FLUSH TABLES'): FLUSH TABLES 

8.0.4>SELECT STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;")\G
STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;"): SET GLOBAL `second_cache` . `key_buffer_size` = ? * ? ;

8.0.4>SELECT STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;")\G
STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;"): CREATE TABLE `t1` ( `a2` INTEGER UNSIGNED NOT NULL , `b2` INTEGER UNSIGNED NOT NULL , `c2` INTEGER UNSIGNED NOT NULL , PRIMARY KEY ( `a2` ) , INDEX `b2x` ( `b2` ) , INDEX `c2x` ( `c2` ) ) ENGINE = MEMORY ; 

Если SQL не поддерживается, вы получите ошибку. Как и следующий, но в этом ответе есть что-то особенное;

8.0.4>SELECT STATEMENT_DIGEST_TEXT('HELP SELECT')\G
ERROR 3676 (HY000): Could not parse argument to digest function: "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 'SELECT' at line 1".

Вы видели, что особенного? Дело в том, что «HELP» является действительным, но клиентским ключевым словом, а не серверным ключевым словом. В любом случае, недопустимый оператор SQL приведет к аналогичной ситуации; ошибка.

Таким образом, вы можете проверить, основываясь на ОШИБКАХ или НЕТ ОШИБКАХ, чтобы узнать, действителен ли переданный синтаксис SQL (исключая очень ограниченный набор команд только на стороне клиента, но они не будут интересны большинству людей) .

Резюме; SELECT STATEMENT_DIGEST_TEXT - это комплексный синтаксический анализатор SQL (хотя это может быть не прямая / предполагаемая функция), который можно использовать во всех случаях для быстрой проверки правильности операторов и без их фактического выполнения. Это огромный прогресс в том, что касается проверки правильности SQL.

Обратите внимание, что для этого вам нужно настроить и запустить сервер MySQL. Вы можете передавать запросы с помощью клиента mysql -e или канала mysql и т. Д.

2 голосов
/ 05 июня 2009

Существует несколько бесплатных / пробных программ, которые позволят вам подключиться к базе данных MySQL или просто вставить сценарий для его проверки. Google твой друг здесь. Mimer будет проверять синтаксическую проверку ANSI-стандарта , но, вероятно, не обрабатывать какие-либо особенности MySQL.

1 голос
/ 06 июня 2009

Вы можете вставить его в браузер запросов, такой как MySQL Query Browser (часть пакета GUI Tools), и визуально проверить, как ключевые слова и строковые литералы окрашены, чтобы легче было видеть, не допустили ли вы какие-либо синтаксические ошибки. *

http://dev.mysql.com/downloads/gui-tools/5.0.html

1 голос
/ 05 июня 2009

Есть несколько возможностей. Если вы используете таблицы InnoDB, которые поддерживают транзакции, вы можете просто выполнить start transaction; в начале вашего файла .sql и rollback; в конце. MySQL выведет любые синтаксические ошибки.

Если вы тестируете операторы UPDATE или DELETE, вы можете добавить LIMIT 0 в конец, чтобы эти запросы не вносили изменений в базу данных, и при этом MySQL проверял синтаксис.

1 голос
/ 05 июня 2009

просто запустите ....

начать транзакцию

запустить его

Откат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...