2010-10-19 218 views
15

我們目前正在設置集成服務器,並且在此過程中,我們在SVN上設置了預提交掛鉤,以便我們的開發人員無法簽入文件這在語法上是無效的(主要是PHP和XML)。如何檢查(My)SQL語句的語法正確性

我們也有一堆.sql文件(用於MySQL),我也想要棉絨。不幸的是,Google沒有爲這項任務提供任何有用的信息。

任何想法?

+1

完全相同的問題 - 系統必須處理DDL(實際上SQL文件都是DDL),並且使用MySQL增強。 – 2014-10-09 15:02:31

回答

5

商業版本的MySQL Workbench有一個MySQL語句的語法檢查器,但當然這隻會覆蓋數據庫方面。請參閱http://mysql.com/products/workbench/(儘管我在免費應用程序的幫助索引中找到了factoid)。

+0

謝謝!但不幸的是,我不認爲我可以和老闆討價還價,只是爲了讓我們的整合服務器有另一個整潔的玩具:) – n3rd 2010-10-20 07:28:12

3

這是一個validator,它針對SQL 92/99/2003標準進行驗證,但是您提到MySQL的事實讓我相信您在SQL查詢中使用了MySQL特定的語法。

一種選擇是在處理數據庫層時使用不可知論的方法,編寫不可知的SQL代碼。您顯然需要與Mimer聯繫,看看您是否可以脫機並將其集成到您的CI環境中。

總體方法中的「ifs」夫婦,這一切都取決於您在當前狀態下願意/能夠編寫不可知SQL代碼的事實。

+1

Intersting鏈接!不幸的是,編寫不可知的SQL不是一種選擇。 Out系統有很多流量,我們需要擠出MySQL的最後一點性能(至少在某些地方)。 – n3rd 2010-10-19 21:03:01

7

在Mysql中搜索CLI中的語法linting以在Jenkins中使用並且沒有快速找到任何東西之後(此Stackoverflow問題是第一個結果 - LOL)我想出了以下解決方案(操作系統:Linux ,但應該是可行的與Windows太):

有點像follwoing:

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 

(要檢查你可以使用 「< filename.sql」,而不是-b -e '語句' SQL文件)

如果查詢語法c它不會被mysql解析它聲稱: 錯誤1064(42000)在第1行:您的SQL語法中有錯誤;檢查與你的MySQL服務器版本相對應的手冊,在第1行的''附近使用正確的語法

只有在語法正確的情況下,它纔會嘗試執行查詢並意識到表不存在,但是這不是有趣的是:

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

因此,錯誤1064是無效語法。您只需創建一個空的測試數據庫,否則只會出現錯誤的FROM部分(例如,爲了獲得有效的語法檢查結果,需要數據庫:'select asdf from s where x and if;)。

據我測試它工作正常(版本Mysql 5.5)。

這裏完整的bash腳本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 
1

我寫了一個命令行工具,語法檢查使用phpMyAdmin的SQL語法分析程序SQL文件:php-sqllint