2010-10-19 10 views
15

के लिए SQL कथन हम वर्तमान में ऊपर बाहर एकीकरण सर्वर स्थापित कर रहे हैं और कहा कि प्रक्रिया के दौरान हम सेट कर लेते हैं SVN पर पहले से प्रतिबद्ध हुक ताकि हमारे डेवलपर्स फाइलों में जांच नहीं कर सकता जो वाक्य रचनात्मक रूप से अमान्य हैं (मुख्य रूप से PHP और XML)।मैं कैसे जांच कर सकते हैं (मेरे) वाक्य शुद्धता

हम भी .sql फ़ाइलें (MySQL के लिए), जो मैं भी एक प्रकार का वृक्ष करना चाहते हैं का एक समूह है। दुर्भाग्यवश, Google ने इस कार्य के लिए कुछ भी उपयोगी नहीं किया।

कोई विचार?

+1

बिल्कुल वही समस्या - और सिस्टम को डीडीएल (वास्तव में एसक्यूएल फाइलें सभी डीडीएल) से निपटने चाहिए, और MySQL एन्हांसमेंट के साथ। –

उत्तर

5

वाणिज्यिक MySQL वर्कबेंच के संस्करण में MySQL कथन के लिए एक वाक्यविन्यास परीक्षक है, लेकिन निश्चित रूप से केवल डेटाबेस पहलुओं को कवर करेगा। http://mysql.com/products/workbench/ देखें (हालांकि मुझे मुफ्त ऐप के लिए सहायता सूचकांक में फैक्टॉयड मिला)।

+0

धन्यवाद! लेकिन दुर्भाग्यवश मुझे नहीं लगता कि मैं अपने मालिक को अपने एकीकरण सर्वर के लिए एक और साफ खिलौना रखने के लिए बात कर सकता हूं :) – n3rd

3

यहाँ एक validator, जो 92/99/2003 मानकों तथापि एसक्यूएल के विरुद्ध यहां सत्यापन सच है कि आप का उल्लेख MySQL मुझे ओर जाता है तो आप अपने एसक्यूएल प्रश्नों में MySQL विशिष्ट वाक्यविन्यास का उपयोग कर रहे विश्वास करने के लिए है।

एक विकल्प अपने डेटाबेस परत के साथ काम कर, नास्तिक एसक्यूएल कोड लिखने में एक नास्तिक दृष्टिकोण करने के लिए कदम है। आपको स्पष्ट रूप से मिमर के संपर्क में आने की आवश्यकता होगी ताकि आप इसे ऑफ़लाइन ले सकें और इसे अपने सीआई पर्यावरण में एकीकृत कर सकें।

"भारतीय विदेश सेवा" समग्र दृष्टिकोण में की युगल और यह सब सच है कि आप नास्तिक एसक्यूएल कोड लिखने के लिए तैयार/वर्तमान स्थिति में पा रहे हैं पर निर्भर है।

+1

इंटरस्टिंग लिंक! दुर्भाग्य से, अज्ञेय एसक्यूएल लिखना एक विकल्प नहीं है। आउट सिस्टम में बहुत अधिक ट्रैफिक है और हमें MySQL (कम से कम कुछ स्थानों पर) के प्रदर्शन के हर अंतिम बिट को निचोड़ने की आवश्यकता है। – n3rd

7

जेनकिंस में उपयोग करने के लिए माइस्क्ल में सिंटैक्स लिनटिंग के लिए एक सीएलआई उपकरण खोजने के बाद और कुछ भी जल्दी नहीं मिला (यह स्टैक ओवरफ्लो प्रश्न पहले परिणामों में से एक है - एलओएल) मैं निम्नलिखित समाधान के साथ आया (ओएस: लिनक्स , लेकिन भी विंडोज के साथ संभव होना चाहिए):

तरह 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" के बजाय बी -e 'बयान' जांच करने के लिए)

यदि क्वेरी सी का सिंटैक्स mysql द्वारा पार्स नहीं किया गया है, यह दावा करता है: ERROR 1064 (42000) पंक्ति 1 पर: आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; मैन्युअल रूप से लाइन 1

पर उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाता है, केवल सिंटैक्स सही है, तो यह क्वेरी निष्पादित करने का प्रयास करता है और महसूस करता है कि तालिका मौजूद नहीं है लेकिन यह नहीं है अब दिलचस्प नहीं है:

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

त्रुटि 1064 अमान्य वाक्यविन्यास है। आपको केवल एक खाली परीक्षण डेटाबेस बनाने की आवश्यकता है क्योंकि अन्यथा केवल गलत से भिन्न त्रुटियों वाली त्रुटियां दिखाई देंगी (उदाहरण के लिए, वैध वाक्यविन्यास जांच परिणाम प्राप्त करने के लिए डेटाबेस की आवश्यकता है: 'x से if और if; से asdf चुनें)।

जहां तक ​​मैंने परीक्षण किया है यह ठीक काम करता है (संस्करण MySQL 5.5)।

यहां एक संपूर्ण बैश स्क्रिप्ट वर्शन: php-sqllint:

#!/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 एसक्यूएल पार्सर का उपयोग कर एसक्यूएल फ़ाइलें एक CLI उपकरण लिखा है।