2009-02-04 11 views
7

What is your most useful sql trick to avoid writing more sql?. में Kyralessa द्वारा इस प्रश्न का सुझाव दिया गया था, मुझे अंतिम प्रश्न से प्रयास करने के लिए बहुत अच्छे विचार मिल गए हैं, कि मुझे यह देखने में दिलचस्पी है कि इस प्रश्न के साथ क्या आता है।अधिक एसक्यूएल लिखने से बचने के लिए आपने किस कोडिंग चाल का उपयोग किया है?

एक बार फिर, मैं इस प्रश्न से प्रतिष्ठा नहीं रख रहा हूं। मैं जवाब के लिए 7 दिन इंतजार कर रहा हूं, फिर इसे विकी चिह्नित कर रहा हूं। प्रश्न जो अर्जित हुआ है, सवाल के लिए एक बक्षीस में चला जाता है।

बुनियादी नियमों:

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

  • अवधारणा को संवाद करें, ताकि अन्य उपयोगकर्ता कहें "ओह वाह, मुझे नहीं पता था कि आप ऐसा कर सकते हैं।"

  • उदाहरण कोड बहुत उपयोगी है, जो मुख्य रूप से दृश्य शिक्षार्थियों की मदद करने के लिए बहुत उपयोगी है।

  • स्पष्ट रूप से बताएं कि आप किस भाषा का उपयोग कर रहे हैं, और आप किस SQL ​​का उपयोग कर रहे हैं।

  • अपने पाठकों के जूते में खुद को रखें। उनके सामने स्क्रीन पर उन्हें देखने की क्या ज़रूरत होगी, जो एक एपिफेनी का कारण बनेंगे। आपका उत्तर पाठक को लाभ पहुंचाने के लिए है। उनके लिए इसे लिखें।

  • ऑफ़साइट लिंक ठीक हैं, अगर वे उदाहरण के बाद दिखाई देते हैं। एक वास्तविक जवाब के लिए एक विकल्प के रूप में ऑफसाइट लिंक नहीं हैं।

संभवतः पाठक के लिए इसे बेहतर बनाने के लिए अन्य चीजें हैं जिन्हें मैंने नहीं सोचा है। रचनात्मक हो। शेयर का ज्ञान। मजा दिखाओ।

[संपादित करें] ऐसा लगता है कि थोड़ी देर में कोई गतिविधि नहीं हुई है। 5 वोट = 50, इसलिए बक्षीस है, और इसे विकृत कर दिया गया है।

+0

+1, क्योंकि यह अभी -1 है और मैं वास्तव में उस बिंदु को समझ नहीं पा रहा हूं। यह एक वैध सवाल है। – hmcclungiii

+0

मुझे पता है कि मैंने इसका उत्तर दिया है, लेकिन अब जब मैं एक लिंक के माध्यम से पढ़ रहा हूं: इस प्रश्न और एक के बीच क्या अंतर है। कम कोड लिखने के लिए कम एसक्यूएल और एसक्यूएल चाल लिखने के लिए चाल चलाना? कोई फर्क नहीं पड़ता कि। –

+0

दोनों एक ही प्रश्न हैं। कृपया इस सवाल को बंद करें। – Niyaz

उत्तर

1

मैं हम कहाँ काम कई कार्य कर लेते हैं एसक्यूएल कम करने के लिए और जावा में एसक्यूएल का उपयोग कर के जुड़े भूमि के ऊपर कम करने के लिए। (हम जावा को एमएसएसएलएल, माईएसक्यूएल, और ओरेकल के साथ चलाते हैं)।

सबसे उपयोगी चाल बाध्यकारी पैरामीटर के लिए जावा की setObject विधि का उपयोग करना है। यह, varargs के साथ संयुक्त, आप एसक्यूएल क्रियान्वित करने के लिए एक उपयोगिता विधि लिखने की सुविधा देता है:

DBUtil.execSQL(Connection con, String sql, Object... params) 

सीधे शब्दों में मानकों से अधिक पुनरावृति और statement.setObject का उपयोग करें (सूचकांक, परम [सूचकांक -1])। नल के लिए आप setNull() का उपयोग करते हैं। हमने GetResultSet विधि के साथ प्रश्नों के लिए इस अवधारणा को बढ़ाया है; लपेटा परिणाम परिणाम ऑब्जेक्ट भी अपने कथन को बंद कर देता है, जिससे संसाधन प्रबंधन करना आसान हो जाता है।

वास्तविक एसक्यूएल कोड लिखा कम करने के लिए, हम एक प्रश्न इमारत ढांचे आप स्तंभ तथा उनके प्रकार का एक समूह निर्दिष्ट करें और फिर इस का उपयोग स्वचालित रूप से खोज मापदंड और आउटपुट स्तंभ निर्दिष्ट करने के लिए देता है कि है। हम आसानी से जुड़ सकते हैं और मानदंडों में शामिल हो सकते हैं और यह सामान्य मामलों में से अधिकांश को संभालता है। लाभ यह है कि आप विभिन्न क्वेरी पैरामीटर, सॉर्टिंग, ग्रुपिंग इत्यादि सहित कोड की लगभग 10 पंक्तियों में एक रिपोर्ट जेनरेट कर सकते हैं। कोड यहां शामिल करने के लिए बहुत जटिल है।

मैं भी Oracle की ALL_TABLES और ALL_TAB_COLUMNS तालिकाओं का उपयोग किया है SELECT स्टेटमेंट्स उत्पन्न करने के लिए; एक और चाल मैं का उपयोग किया है ResultSetMetadata का उपयोग कर तालिका का विश्लेषण करने के लिए है:

ResultSet rs = DBUtil.getResultSet(con, "SELECT * FROM " + someTable); 
ResultSetMetaData rsm = rs.getMetaData(); 

boolean first = true; 
for (int i = 1; i <= rsm.getColumnCount(); i++) { 
    String col = rsm.getColumnName(i).toUpperCase(); 
    // do something with the column name 
} 

इससे बयान के कुछ प्रकार उत्पन्न करने के लिए बनाता है; इस मामले में हमारे पास एक सक्रिय टेबल और एक संग्रह तालिका है और हम एक से दूसरे में रिकॉर्ड ले जा रहे हैं। एक संग्रह तालिका का उपयोग करने के बारे में बहस के बिना, मैंने जो जावा कोड लिखा है, उसे संग्रहित स्क्रिप्ट को संशोधित किए बिना दो तालिकाओं को संशोधित करने देता है।

एक और चाल जो हम उपयोग करते हैं वह है हमारी सभी टेबल और कॉलम नामों के लिए स्थिरांक का उपयोग करना। यह एसक्यूएल को थोड़ा कठिन बना देता है लेकिन यह हमें (अन्य चीजों के साथ) समान या समान निर्माण वाले तालिकाओं के लिए आसानी से एसक्यूएल उत्पन्न करने की अनुमति देता है। चूंकि हम स्तंभ नामों को परिभाषित करने के लिए स्थिरांक का उपयोग करते हैं, इसलिए कोड वास्तव में लागू करता है कि समान स्तंभों का एक ही नाम होता है। स्थिरांक का उपयोग करने से आपको किसी विशेष कॉलम के संदर्भ मिलते हैं, जिससे आप अन्य SQL कथनों की जांच कर सकते हैं जो आपके द्वारा किए जा रहे कार्यों से संबंधित हो सकते हैं। यह हमें उसी मॉड्यूल को फिर से लिखने के बजाय, अन्य मॉड्यूल से एसक्यूएल का दोबारा उपयोग करने देता है।

2

INFORMATION_SCHEMA में मेटाडेटा से SQL एसपी, दृश्य आदि उत्पन्न करें। उस कोड पीढ़ी को कस्टम कोड के साथ बढ़ाया जा सकता है।

यदि कई एसपी समान कार्य करेंगे, रखरखाव के एक बिंदु की आसानी के लिए, मैं इसके बजाय गतिशील एसक्यूएल उत्पन्न करूंगा।

इन सभी चीजों के परिणामस्वरूप कम SQL कोड, और अधिक कोड का पुन: उपयोग किया जाता है, और बेहतर परीक्षण किया जाता है - किसी पुस्तकालय की तरह।

Here's an example of code generation to avoid writing SQL

10

आप writting से बचने के लिए एसक्यूएल एसक्यूएल/इकाई की रूपरेखा के लिए Linq ऐसे nHibernate के रूप में एक ORM, या Microsoft प्रसाद से एक का उपयोग

यह बेहतर फिर भी एक जनरेटर का उपयोग जब से तुम जीत लिया है चाहते हैं जनरेटर को फिर से शुरू करने की आवश्यकता नहीं है, और यदि आप फ्लुएंट nHibernate का उपयोग करते हैं तो आप कॉन्फ़्रेंस के माध्यम से कॉन्फ़िगरेशन सक्षम कर सकते हैं और मैपिंग फ़ाइल/कक्षा को भी बनाए रख सकते हैं।

2

भाषा: सी #/वीबी.नेट।

मैं वर्तमान में कोई भी एसक्यूएल लिखने के बिना एक डीबी समर्थित प्रणाली लिख सकता हूं। मेरा डीएएल फ्लाई पर एसक्यूएल उत्पन्न करने के लिए पीओजेओ की कक्षा परिभाषाओं का उपयोग करता है। उदाहरण:

SearchCriteria sc = new SearchCriteria(); 
sc.AddBinding("Customer_id", "ALFKI"); 
List<Entity> customers = SQL.Read(sc, new Customers()); 

उपर्युक्त कोड ग्राहक_आईडी से मेल खाने वाले ग्राहक उदाहरणों की एक सूची वापस लौटाएगा "ALFKI"। डीएएल डीबी से जुड़ता है, एसक्यूएल बनाता है, इसे निष्पादित करता है, नई वस्तुओं को तुरंत चालू करता है, उन्हें पॉप्युलेट करता है और उन्हें वापस भेजता है। जब आप वस्तुओं को बदलने से किया जाता है, बस

SQL.Write(customer); 

वापस डाटाबेस के लिए अद्यतन सब बदल गया आइटम नहीं हैं करने के लिए कहते हैं - आप बुरा, केवल जो कि बदल गया है और स्तंभ ही बदल दिया है।

जोड़ा गया बोनस: यह SQL सर्वर, ओरेकल, इनफॉर्मिक्स का समर्थन करता है। ग्राहक कोड को कभी बदलना नहीं है।

+0

@ मार्लोन - कोई जांच नहीं, हालांकि मुझे शायद यह बहुत जल्दी मिल जाएगा - कुछ कारणों से लोग प्रतिबिंब से घृणा करते हैं - जो बीटीडब्ल्यू एनएचबर्ननेट पूरे स्थान पर उपयोग करता है! –

0

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

public static void BindDataGridViewWhere(DataGridView dgv, string tablename, string selectList, string whereClause) 
{ 
    Query qQuery = new Query(tablename); 
    qQuery.SelectList = selectList; 
    qQuery.WHERE(whereClause); 
    DataSet dsDGV = qQuery.ExecuteDataSet(); 
    dgv.DataSource = dsDGV.Tables[0]; 
    dgv.RowHeadersVisible = false; 
} 

तो पेज में,:

उदाहरण के लिए, अगर आप को भरने के लिए एक datagrid है और आप एक दृश्य, मेज, संग्रहीत से पॉप्युलेट करने के लिए proc पता है, एक समारोह निम्नलिखित सी # कोड के समान बनाने के init या उस तरह कुछ, इस विधि के लिए सरल 1 लाइन कॉल, जहां कथन के साथ डेटाग्रिडव्यू पास कर रहा है, आप क्या दिखाना चाहते हैं और कैसे चुनें, और कहां और आप बाध्य हैं।

बिंदडाटा ग्रिड व्यूवेयर (डीजीवीसीएआरएस, "टीबीबीआईआरएआरएस", "कारनाम", "रंग, मॉडल के रूप में एमडीएल", "रंग = 'नीला'");

यह किसी भी ऑब्जेक्ट के लिए बहुत अच्छा काम करता है जो आप ड्रॉपडाउनबॉक्स, सूची बॉक्स, डेटाग्रिडव्यू, कुछ और के साथ बाध्यकारी करते हैं। फिर, दूसरों के लिए जो इस मॉडल में फिट नहीं हैं, उनके पास एक तरीका है जो सिर्फ डेटासेट देता है। इस तरह यदि आपको इसे प्रदर्शित करने से पहले इसके साथ बातचीत करने की आवश्यकता है, तो आप अतिरिक्त व्यावसायिक तर्क आदि कर सकते हैं।

मुझे यह दृष्टिकोण पसंद है क्योंकि यदि आप डेटा ढांचे को स्विच करना चाहते हैं, तो आपके पास बदलाव करने के लिए 1 स्थान है। आप इस तरह से एक स्क्रीन बहुत जल्दी बना सकते हैं।

0

मैंने outlet-orm का उपयोग किया है जो एक अद्भुत ओआरएम समाधान है जो उत्पन्न नहीं करता है। मुझे लगता है कि मैंने पहले की सभी चालों में से एक को अब तक का सबसे सुविधाजनक और समय बचाने के लिए किया है।

0

यदि आप पाइथन पर्यावरण का उपयोग करना संभव है तो मैं अत्यधिक अनुशंसा करता हूं।

मैंने जिस चीज की कोशिश की वह काम पर हमारे सिस्टम का परीक्षण करने के लिए अपना स्वयं का स्कीमा जनरेटर लिख रहा है। सिस्टम को दुर्घटनाग्रस्त करने के प्रयास के लिए प्रश्नों के विभिन्न संयोजन उत्पन्न करने के लिए यह और अधिक था। असल में, मैं शब्दकोशों और सूचियों

SQLAlchemy

साथ पेड़ deparse एक छद्म परिभाषित, कोड स्निपेट

>>>for row in session.query(User, User.name).all(): 
... print row.User, row.name 
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users [] 
<User('ed','Ed Jones', 'f8s7ccs')> ed 
<User('wendy','Wendy Williams', 'foobar')> wendy 
<User('mary','Mary Contrary', 'xxg527')> mary 
<User('fred','Fred Flinstone', 'blah')> fred 
2

मैं MySQL के लिए PHP में अपने ही ORL (वस्तु संबंधपरक मैपर) लुढ़का है। यह डेटाबेस को बदलने के साथ हर चीज को वास्तव में सरल बनाता है, और यह सरल परिस्थितियों के लिए बहुत अच्छी तरह से काम करता है।

इसमें एक बेस क्लास शामिल है जिसे आप प्राप्त कर सकते हैं। आप इसे आसानी से उपclass:

<?php 
class CSomething extends CDatabaseObject 
{ 

} 

// create a new Something 
$oSomething = new CSomething(); 
$oSomething->somevariable = 'blah'; 
$oSomething->Save(); 

// fetch an old Something by primary key 
$oSomething = new CSomething(1); 
// .. and delete it 
$oSomething->Delete(); 
?> 

यह स्वचालित रूप से तालिका में इंडेक्स और प्राथमिक कुंजी का आंकलन करता है। यदि यह आवश्यक है, तो आप निश्चित रूप से कक्षाओं को इन चीजों को बता सकते हैं यदि यह कुछ खराब करता है।

आप SQL के WHERE खंड को निर्दिष्ट करके मूल खोज कर सकते हैं (इसलिए यह पूरी तरह से SQL मुक्त नहीं है)। चूंकि यह फ़ील्ड के डेटा प्रकारों के बारे में बताता है, पैरामीटरयुक्त प्रश्न सरल हैं।

बेशक, यह मेरी हर चीज नहीं कर सकता है, लेकिन यह बहुत सारे विकास का समय और कोड बचाता है।

1

मेरी परियोजनाओं में से एक में, मैं मेटा-मॉडल (टेबल, कॉलम, रिलेशनशिप) का उपयोग करता हूं जो अंतर्निहित sys * विचारों को जानकारी जोड़ता है।

मेरे मेटा-मॉडल में डेटा का हिस्सा डालने/अपडेट/हटाने के लिए लॉगिंग ट्रिगर्स उत्पन्न करने के लिए उपयोग किया जाता है, और बदले में ट्रिगर्स को हटाने के लिए कैस्केडिंग डिलीट को लागू करने के लिए किया जाता है। लगभग के साथ।इन ट्रिगर्स के लिए जेनरेट कोड 100 टेबल टीएसक्यूएल कोड की लगभग 12.000 लाइनें हैं।

एक एसपी एक सी # डेटा संरचना उत्पन्न करता है जो सुनिश्चित करता है कि उन्नयन ठीक हो गया है, यह सुनिश्चित करने के लिए मेरे विकास डेटाबेस स्कीमा के साथ लाइव डेटाबेस स्कीमा की तुलना करता है।

हाल ही में मेटा-मॉडल ने मुझे फॉर्मव्यू-आधारित Asp.Net रूपों में सत्यापन को हटाने के लिए सी # कोड उत्पन्न करने की अनुमति दी है (यानी रिकॉर्ड्स मौजूद होने पर रिकॉर्ड को हटा नहीं सकता है)।

0

का उपयोग करना (वीबी उदाहरण दिखाया गया है) आंकड़ों के एकाधिक स्तंभों के लिए बाध्य एक ही बार में प्रदर्शित करने के लिए निर्मित इस तरह अभिव्यक्ति कॉलम के रूप में नेट सुविधाओं,:

ds.Tables(0).Columns.Add(
    New DataColumn("CustomDescription", GetType(String), 
        "LastName + ', ' + FirstName + ' - ' + 
        WorkEmail")) 
ResultsListBox.DataSource = ds 
ResultsListBox.DataTextField = "CustomDescription" 
ResultsListBox.DataValueField = "EmployeeID" 
ResultsListBox.DataBind() 
0

वहाँ एसक्यूएल के साथ कुछ भी गलत नहीं है। सही नौकरी के लिए सही उपकरण का प्रयोग करें।

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

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