2008-12-18 101 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引擎和设置,你可以开始交易时,尽量查询,然后执行回滚。假设肮脏的读取关闭,这应该工作。