2009-11-30 13 views
10

एक अस्पष्ट शीर्षक का थोड़ा सा, मैं समझाऊंगा।एसक्यूएल स्क्रिप्ट सम्मिलित स्क्रिप्ट बनाने के लिए

मैं अपने डेटाबेस में किसी तालिका की प्रत्येक पंक्ति के लिए एक सम्मिलन कथन बनाने के लिए एक SQL स्क्रिप्ट लिख रहा हूं, पूरी तरह से उस डेटा को किसी अन्य डेटाबेस पर लागू करने में सक्षम होने के लिए।

यहाँ मैं इस समय है:

SELECT 'INSERT INTO products (id,name,description) VALUES ('||ID||','''||name||''','''||description||''');' FROM products 

और यह महान काम करता है, इस outputting:

INSERT INTO products (id,name,description) VALUES (1,'Lorem','Ipsum'); 
INSERT INTO products (id,name,description) VALUES (2,'Lorem','Ipsum'); 
INSERT INTO products (id,name,description) VALUES (3,'Lorem','Ipsum'); 
INSERT INTO products (id,name,description) VALUES (4,'Lorem','Ipsum'); 

यदि फ़ील्ड खाली है उस पंक्ति को असफल हो जायेगी समस्या है एक अद्यतन स्क्रिप्ट का उत्पादन, आउटपुट फ़ाइल में लाइन बस खाली है। जाहिर है कि 20+ फ़ील्ड हैं, कुछ वैकल्पिक इसका मतलब है कि मेरी कोई भी स्क्रिप्ट उत्पन्न नहीं होती है।

क्या इस मुद्दे को हल करने का कोई तरीका है?

उत्तर

5

शून्य क्षेत्रों के मामले में आप सम्मिलित समारोह सूची में पहले nonnull मान देता है

की तरह कुछ
Select COALESCE(Name, '') from... 

कर सकते हैं।

वास्तव में रिक्त फ़ील्ड (उदाहरण के लिए खाली nvarchar) के लिए मेरा मानना ​​है कि उपर्युक्त आपकी स्क्रिप्ट काम करेगी।

+0

चीयर्स क्रिस में नया है, यह बहुत अच्छा काम करता है। –

+0

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

+2

यह भी वही सटीक पंक्तियां उत्पन्न नहीं करेगा। ऊपर के रूप में coalesce खाली स्ट्रिंग मान डालने समाप्त हो जाएगा जहां यह नल मान डालना चाहिए। –

4

quote_nullable() पोस्टग्रेएसक्यूएल 8.4 में नया कार्य करें। (एसक्यूएल इंजेक्शन) शून्य मान की अनुमति के अलावा, यह आपके डेटा प्रकारों को बरकरार रखे हुए और बॉबी टेबल्स से बचाता है:

SELECT 'INSERT INTO products (id,name,description) VALUES (' || 
quote_nullable(ID) || ',' || quote_nullable(name) || ',' || 
quote_nullable(description) || ');' FROM products; 

पुराने संस्करणों में, आप coalesce() और quote_literal() साथ समान व्यवहार प्राप्त:

SELECT 'INSERT INTO products (id,name,description) VALUES (' || 
coalesce(quote_literal(ID), 'null') || ',' || 
coalesce(quote_literal(name), 'null') || ',' || 
coalesce(quote_literal(description), 'null') || ',' || 
');' FROM products; 
+0

आपकी प्रतिक्रिया के लिए बहुत धन्यवाद, लेकिन मुझे एक त्रुटि है कि समारोह quote_nullable मौजूद नहीं है मिलता है। इस क्रिस क्लार्क समाधान के बावजूद काम किया है। फिर, बहुत धन्यवाद। –

+0

डी ओह, 'quote_nullable() 'PostgreSQL 8.4 – intgr

13
pg_dump -a -U user1 -t products -f products.copy database1 

और उसके बाद:

psql -U user2 -d database2 -f products.copy 

और बस हो गया। यह भी सुरक्षित और तेज है।

1

मैंने चयन कथन बनाने के लिए @intgr उत्तर के आधार पर एक पायथन लिपि लिखा था। यह stdin (उपयोग -) से कॉलम की अल्पविराम से अलग सूची लेता है।

मैं sqlparse का उपयोग करना चाहता था लेकिन मुझे समझ में नहीं आया कि उस lib का उपयोग कैसे करें।

import fileinput 

names = ' '.join(fileinput.input()) 

ns = [x.strip() for x in names.split(',')] 
quoted = ['quote_nullable(' + x + ')' for x in ns] 
insert = "SELECT 'INSERT INTO <TABLE> (" + (', ').join(ns) + ") VALUES(' || " + (" || ',' || ").join(quoted) + " || ');' FROM <TABLE>" 
print insert 

स्क्रिप्ट का एक सार यहाँ है: https://gist.github.com/2568047

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