Как проверить синтаксис SQLite3? - PullRequest
3 голосов
/ 27 мая 2010

Есть ли способ проверить синтаксис сценария SQLite3 без его запуска?

По сути, я ищу SQLite3 эквивалент ruby -c script.rb, perl -c script.pl, php --syntax-check script.php и т. Д.

Я думал об использовании explain, но большинство скриптов, которые я хотел бы проверить, хранятся в справочных целях (и не обязательно имеют связанную базу данных). Использование explain также затруднит использование с чем-то вроде Syntastic . (То есть я только хочу проверить синтаксис , а не семантика .)

Обновление:

Я в замешательстве. Допустим, я хочу, чтобы синтаксис проверил это:

select * from foo;

Я мог бы сделать что-то вроде:

echo 'explain select * from foo;' | sqlite3

Но тогда я получаю:

SQL error near line 1: no such table: foo

Все, что я ожидал бы увидеть, это "Синтаксис ОК" (или что-то подобное). Это возможно?

Ответы [ 3 ]

1 голос
/ 29 июня 2016

Синтаксическая проверка, которая до сих пор хорошо работает для меня, это гем Ruby sqlint

Он проверяет ANSI SQL: он не относится к диалекту sqlite.

Оно появилось в 2015 году, через 5 лет после того, как был задан вопрос

Требуется Ruby и компилятор C (для создания собственного расширения pg_query.)

Вот пример вывода: $ sqlint ex7a.sql ex7a.sql:81:10:ERROR syntax error at or near "*"

В истинной традиции Unix, если синтаксис правильный, sqlint не производит вывод. Как спросил спрашивающий, он не проверяет, существуют ли таблицы.

0 голосов
/ 27 мая 2010

Как вы упомянули, вы можете использовать ключевое слово EXPLAIN . Он вернет информацию о том, как будет выполняться инструкция, если вы опустите предыдущее ключевое слово EXPLAIN.

0 голосов
/ 27 мая 2010

Возможно, вы могли бы использовать EXPLAIN для базы данных в памяти. С sqlite3 вы можете получить базу данных в памяти, передав ": memory:" в качестве имени файла sqlite3_open_v2 ().

...