2011-01-03 16 views
70

करने के लिए फ़ाइल मैं PostgreSQL में उत्पादन के साथ SQLite डेटाबेस का उपयोग कर विकास कर रहा हूँ। मैंने अपने स्थानीय डेटाबेस को बड़ी मात्रा में डेटा के साथ अपडेट किया है और उत्पादन डेटाबेस में एक विशिष्ट तालिका को स्थानांतरित करने की आवश्यकता है।Convert SQLite एसक्यूएल डंप PostgreSQL

sqlite database .dump > /the/path/to/sqlite-dumpfile.sql चल के आधार पर, SQLite निम्न स्वरूप में एक मेज डंप आउटपुट:

BEGIN TRANSACTION; 
CREATE TABLE "courses_school" ("id" integer PRIMARY KEY, "department_count" integer NOT NULL DEFAULT 0, "the_id" integer UNIQUE, "school_name" varchar(150), "slug" varchar(50)); 
INSERT INTO "courses_school" VALUES(1,168,213,'TEST Name A',NULL); 
INSERT INTO "courses_school" VALUES(2,0,656,'TEST Name B',NULL); 
.... 
COMMIT; 

कैसे मैं एक PostgreSQL संगत डंप फ़ाइल है कि मैं अपने उत्पादन सर्वर में आयात कर सकते में ऊपर परिवर्तित?

उत्तर

74

आप सीधे psql में है कि डंप फ़ाइल को खिलाने के लिए सक्षम होना चाहिए:

/path/to/psql -d database -U username -W < /the/path/to/sqlite-dumpfile.sql 

आप id स्तंभ "ऑटो वेतन वृद्धि" तो अपने प्रकार "int" से तालिका में बदलने के लिए करने के लिए "धारावाहिक" चाहते हैं निर्माण लाइन PostgreSQL तो उस कॉलम में एक दृश्य देते हैं ताकि शून्य आईडी के साथ आवेषण स्वचालित रूप से अगले उपलब्ध मूल्य आवंटित किया जाएगा होगा। PostgreSQL भी AUTOINCREMENT आदेशों को पहचान नहीं होगा, इसलिए इन हटाया जा करने की जरूरत है।

तुम भी SQLite स्कीमा में datetime स्तंभों के लिए जांच करने और उन्हें timestamp (इस ओर इशारा करते हुए के लिए Clay करने के लिए धन्यवाद) PostgreSQL के लिए बदलने के लिए चाहता हूँ।

यदि आप अपने SQLite में बूलियन्स तो आप 1 और 0 और 1::boolean और 0::boolean (क्रमशः) में परिवर्तित कर सकते हैं या आप डंप की स्कीमा खंड में एक पूर्णांक के लिए बूलियन स्तंभ को बदलने और उसके बाद अंदर हाथ से उन्हें ठीक कर सकता है आयात के बाद PostgreSQL।

आप अपने SQLite में BLOBs है तो आप स्कीमा bytea उपयोग करने के लिए समायोजित करने के लिए चाहता हूँ। आपको शायद कुछ decode calls as well में मिश्रण करने की आवश्यकता होगी। अपने पसंदीदा भाषा में एक quick'n'dirty कॉपियर लेखन एसक्यूएल अगर आप BLOBs का एक बहुत हालांकि से निपटने के लिए mangling की तुलना में आसान हो सकता है।

सामान्य रूप से, यदि आपके पास विदेशी कुंजी हैं तो आप संभवतया set constraints all deferred में डालने की समस्या से बचने के लिए, BEGIN/COMMIT जोड़ी के अंदर कमांड डालने के लिए देखना चाहेंगे।

बूलियन, ब्लॉब के लिए Nicolas Riley के लिए धन्यवाद, और बाधाओं के नोटों।

यदि आपके पास कुछ कोडसाइट 3 क्लाइंट्स द्वारा जेनरेट किए गए आपके कोड पर ` है, तो आपको उन्हें हटाने की आवश्यकता है।

PostgreSQL भी unsigned कॉलम भी नहीं पहचानती, आपको लगता है कि ड्रॉप करना चाह सकते हैं, या इस जैसे एक कस्टम निर्मित बाधा जोड़ें:

CREATE TABLE tablename (
    ... 
    unsigned_column_name integer CHECK (unsigned_column_name > 0) 
); 

जबकि '' को SQLite चूक शून्य मान, PostgreSQL के लिए उन्हें आवश्यकता है NULL के रूप में सेट किया जाना चाहिए।

SQLite डंप फ़ाइल में सिंटैक्स पोस्टग्रेएसक्यूएल के साथ अधिकतर संगत प्रतीत होता है ताकि आप कुछ चीजें पैच कर सकें और इसे psql पर फ़ीड कर सकें। एसक्यूएल आईएनएसईआरटी के माध्यम से डेटा का एक बड़ा ढेर आयात करने में कुछ समय लग सकता है लेकिन यह काम करेगा।

+0

धन्यवाद! धन्यवाद! यह मेरे लिए बहुत अच्छा काम किया। मेरे पास एक कार्यक्रम था जो पहले माइग्रेशन कर रहा था लेकिन यह बहुत धीमा था और अन्य समस्याएं पैदा कर रहा था। आपके आदेश में सुधार। यह होना चाहिए-डी, नहीं-डी। – DevX

+0

एक नोट अगर किसी और को यह समस्या है, तो SQLITE के पास मेरे शून्य मान '' के रूप में थे। POSTGRESQL को शून्य की आवश्यकता है। तो डंप फ़ाइल को ठीक करने के लिए vim को फायर करें और कमांड करें:% s/''/NULL/g। – DevX

+4

नहीं, आप लेनदेन को कुछ ओवरहेड से बचने के लिए रखना चाहते हैं। –

14

मैंने sqlite3postgres माइग्रेशन करने के लिए एक स्क्रिप्ट लिखी।यह https://stackoverflow.com/a/4581921/1303625 में उल्लिखित सभी स्कीमा/डेटा अनुवादों को संभाल नहीं करता है, लेकिन ऐसा करने के लिए मुझे इसकी आवश्यकता होती है। उम्मीद है कि यह दूसरों के लिए एक अच्छा प्रारंभिक बिंदु होगा।

https://gist.github.com/2253099

+2

यह अच्छी तरह से काम करता है! मैंने जिस्ट को फोर्क किया है और टिप्पणी के रूप में कुछ अंतर्दृष्टि जोड़ दी है: https://gist.github.com/bittner/7368128 – Peterino

8

आप एक एक लाइनर का उपयोग कर सकते हैं, यहाँ एसईडी आदेश की मदद से एक उदाहरण है:

sqlite3 mjsqlite.db .dump | sed -e 's/INTEGER PRIMARY KEY AUTOINCREMENT/SERIAL PRIMARY KEY/' | sed -e 's/PRAGMA foreign_keys=OFF;//' | sed -e 's/unsigned big int/BIGINT/g' | sed -e 's/UNSIGNED BIG INT/BIGINT/g' | sed -e 's/BIG INT/BIGINT/g' | sed -e 's/UNSIGNED INT(10)/BIGINT/' | sed -e 's/BOOLEAN/SMALLINT/g' | sed -e 's/boolean/SMALLINT/g' | sed -e 's/UNSIGNED BIG INT/INTEGER/g' | sed -e 's/INT(3)/INT2/g' | sed -e 's/DATETIME/TIMESTAMP/g' | psql mypqdb mypguser 
+0

लंबे प्रकार के लिए कोई प्रतिस्थापन नहीं है, उदा। – yetanothercoder

+1

एक और आइटम जोड़ा जा सकता है 'sed -e'/DATETIME/TIMESTAMP/g'' – silpol

+0

'sed -e '/ TINYINT (1)/SMALLINT/g'' - और सभी डेटा की तुलना के लिए प्रकार https://stackoverflow.com/questions/1942586/comparison-of-database-column-types-in-mysql-postgresql-and-sqlite-cross-map – Purplejacket

29

pgloader

मैं जब के लिए एक रास्ता के लिए खोज इस पोस्ट में आए SQLg डंप को PostgreSQL में कनवर्ट करें। भले ही इस पोस्ट में एक स्वीकार्य उत्तर है (और उस +1 पर एक अच्छा), मुझे लगता है कि यह जोड़ना महत्वपूर्ण है।

मैंने यहां समाधानों की तलाश शुरू कर दी और महसूस किया कि मैं एक और अधिक स्वचालित विधि की तलाश में था। मैं विकि डॉक्स देखा:

https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL

और pgloader की खोज की। बहुत अच्छा आवेदन और यह उपयोग करने के लिए अपेक्षाकृत आसान है। आप फ्लैट SQLite फ़ाइल को एक प्रयोग योग्य PostgreSQL डेटाबेस में परिवर्तित कर सकते हैं। मैं *.deb से स्थापित किया है और एक परीक्षण निर्देशिका में command फ़ाइल इस तरह बनाया:

load database 
    from 'db.sqlite3' 
    into postgresql:///testdb 

with include drop, create tables, create indexes, reset sequences 

set work_mem to '16MB', maintenance_work_mem to '512 MB'; 

docs राज्य की तरह। मैं तो बनाई गई एक testdbcreatedb साथ:

pgloader command

और उसके बाद नए डेटाबेस से जुड़ा:

psql testdb

createdb testdb

मैं pgloader आदेश इस तरह भाग गया

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

अवधारणा को साबित करने के लिए मैंने इस testdb को छोड़ दिया और उत्पादन सर्वर पर विकास वातावरण में आयात किया और डेटा अच्छी तरह से स्थानांतरित किया गया।

+0

सुपर टूल, एक आकर्षण की तरह काम करता है, उपयोग करने में आसान है! – Hannes

+1

सावधान रहें (अभी भी समर्थित) उबंटू वितरण में पुराना संस्करण हो सकता है - v2.x.y पहले से ही बहिष्कृत हैं और वास्तव में काम नहीं करते हैं। v3.2.x काम कर सकता है लेकिन v3.2.3 अनुशंसित है। मैंने खून बहने से v3.2.3 लाया है और _sudo dpkg -i <.deb फ़ाइल नाम> _ के साथ स्थापित किया है, इसमें निर्भरताओं के साथ कोई समस्या नहीं थी। – silpol

+0

मैं @silpol से सहमत हूं - नवीनतम स्थिर रिलीज डाउनलोड करना और अपने एफएवी पैकेज मैनेजर का उपयोग करके इंस्टॉल करना सुनिश्चित करें; "कमांड" फ़ाइल के लिए यह 'कमांड' नामक एक टेक्स्ट फ़ाइल है, जिसमें कोई एक्सटेंशन नाम नहीं है (यानी फ़ाइल नाम के अंत में .txt की आवश्यकता नहीं है) आपको फ़ाइल नाम को कोणीय ब्रैकेट में रखने की आवश्यकता नहीं है; मुझे अपना डेटा देखने के लिए psql डेटाबेस की search_parth को बदलना पड़ा; pgloader अच्छी तरह से काम करता है और मुझे परेशानियों का एक बड़ा सौदा बचाया – BKSpurgeon

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