2008-12-18 11 views
11

मैं एक साधारण टूल बना रहा हूं जो MySQL कमांड की एक स्ट्रिंग प्राप्त करेगा और इसे चलाएगा (क्रमशः कई डीबी सर्वरों पर)। मैं उपयोगकर्ताओं को समझदार होने पर भरोसा करता हूं, लेकिन गलतियां होती हैं, और मैं मूल टाइपो को रोकने के लिए एक तरीका ढूंढ रहा हूं:कैसे जांचें कि MySQL क्वेरी इसे निष्पादित किए बिना मान्य है या नहीं?

रनटाइम पर, अपेक्षाकृत सरल (अपेक्षाकृत सरल) MySQL क्वेरी देखने के लिए कोई तरीका है कि वे ' वाक्य रचनात्मक रूप से सही है?

मैं अर्थपूर्ण शुद्धता की तलाश नहीं कर रहा हूं, उदा। तालिका के नाम या प्रयोज्यता में शामिल हों; एसक्यूएल प्रश्नों के लिए एक वर्तनी जांच की तरह कुछ।

दूसरे शब्दों में,

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 रों के लिए, मैं EXPLAIN मोड़ सकता है मेरी जरूरतों के लिए - EXPLAIN SELECT (...) चलाएं और त्रुटियों के लिए देखें, लेकिन वहां बहुत कुछ है अन्य आदेशों की जांच करने के लिए भी?

उत्तर

7

स्कीमा के ज्ञान के बिना नहीं (उदाहरण के लिए, 'x' एक तालिका है?) और एक एसक्यूएल पार्सर लिखना। आपका MySQL क्वेरी टूल उस तरह की सत्यापन करने में सक्षम होना चाहिए (यदि आपको पसंद है तो इंटेलिजेंस) लेकिन मुझे पहले हाथ अनुभव से पता है, अधिकांश (फ्री) MySQL उपकरण अबाध हैं।

क्वेरी तैयार करना आप जो चाहते हैं वह करेंगे, लेकिन एक रनटाइम चेक है, संकलन समय की जांच नहीं - आप एक संकलन समय/ऑफ़लाइन समाधान की तलाश में लग रहे हैं।

+0

मैं स्क्रिप्ट निष्पादित करने से पहले प्रश्नों की जांच करने का एक त्वरित तरीका ढूंढ रहा था। एक पार्सर लिखना रास्ता ओवरबोर्ड होगा - अगर यह पहले सर्वर पर टूट जाता है, तो यह केवल एक त्रुटि से बाहर निकल जाएगा (माना जाता है कि स्क्रिप्ट उपयोगकर्ता (सिस्टम प्रशासक) यह जानकर पर्याप्त हैं कि वे क्या कर रहे हैं)। – Piskvor

+0

+1 तैयार करने के लिए। यह मेरे ज्ञान के लिए ऐसा करने का एकमात्र तरीका है। – willasaywhat

+0

ऐसा लगता है कि MySQL खाली डीबी पर तैयार नहीं हो सकता है। और कुछ वाक्य रचनात्मक त्रुटियां दिखाई नहीं देती हैं, उदाहरण के लिए एक ही नाम वाले दो फ़ील्ड। – powtac

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 इंजन और सेटिंग के आधार पर, आप एक लेन-देन शुरू कर सकता है क्वेरी का प्रयास करें, और उसके बाद एक रोलबैक करते हैं। गंदे पढ़ने का मानना ​​बंद है, जो काम करना चाहिए।

+1

ओह वाह, मैंने अभी इसी विचार के साथ जेम्स ओग्डेन के जवाब पर एक टिप्पणी पोस्ट की है। मुझे लगता है कि phpMyAdmin, और कोई अन्य आरडीएमएस फ्रंट-एंड जो कई प्रश्नों को स्वचालित रूप से लेनदेन में डिफ़ॉल्ट रूप से संलग्न कर देता है। –

संबंधित मुद्दे