2008-12-18 103 views
11

我正在製作一個簡單的工具,它將獲得一串MySQL命令並運行它(依次在多個數據庫服務器上運行)。我相信用戶是明智的,但出現錯誤,我正在尋找一種方法來防止基本的錯別字:如何檢查MySQL查詢是否有效而不執行?

有沒有辦法在運行時驗證(相對簡單)MySQL查詢,重新語法正確?

我不是在尋找語義的正確性,例如表名或加入適用性;就像SQL查詢的拼寫檢查一樣。

換句話說,

SELECT * FROM x; 

INSERT INTO x SET id=1,bar="foo"; 

將被標記爲有效,而任何這些不會:

SELECT FROM x; 
SECLET * RFOM x; 
ISNETR INTO x SET id=1; 
HJBGYGCRYTCY; 

對於SELECT S,我可以彎曲EXPLAIN根據我的需要 - 運行EXPLAIN SELECT (...)並注意錯誤,但是有沒有是否也檢查其他命令?

回答

7

不知道模式(例如,'x'是一個表?)並編寫SQL解析器。你的MySQL查詢工具應該能夠進行這種驗證(如果你喜歡,可以使用intellisense),但是我從第一手的經驗知道,大多數(免費)MySQL工具都很糟糕。

'準備'查詢會做你想做的事情,但是運行時檢查,而不是編譯時檢查 - 你似乎在尋找一個編譯/離線解決方案。

+0

我正在尋找一種在腳本執行之前檢查查詢的快速方法。編寫一個解析器可能會過度 - 如果它在第一臺服務器上出現故障,它就會退出並顯示一個錯誤(據說腳本用戶(系統管理員)已經足夠清楚瞭解他們在做什麼)。 – Piskvor 2008-12-18 14:09:40

+0

+1準備。這是我知道的唯一方法。 – willasaywhat 2008-12-18 20:25:19

4

您可以創建一個臨時表來規避查詢的副作用:

CREATE TEMPORARY TABLE users SELECT * FROM users; 
INSERT INTO users(name) VALUES('UniqueName'); 
DROP TABLE users; 
SELECT * FROM users WHERE name='UniqueName'; -- Should return 0 results 
6

根據您的MySQL引擎和設置,你可以開始交易時,儘量查詢,然後執行回滾。假設骯髒的讀取關閉,這應該工作。