कन्वर्ट SQLITE SQL डंप फ़ाइल POSTGRESQL करने के लिए


96

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

रनिंग के आधार पर 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 संगत डंप फ़ाइल में कैसे परिवर्तित करूं जिसे मैं अपने उत्पादन सर्वर में आयात कर सकता हूं?


1
खैर, जब तक मैं sqlite 3 से sqlite 3 में
सेजल एर्गुने

जवाबों:


101

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

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

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

आप datetimeSQLite स्कीमा में स्तंभों की जांच करना चाहेंगे और उन्हें timestampपोस्टग्रेक् स के लिए बदल सकते हैं (धन्यवाद इस संकेत की ओर क्ले के लिए)।

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

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

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

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

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

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

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

जबकि SQLite डिफॉल्ट को शून्य मान देता है '', PostgreSQL को उन्हें सेट करने की आवश्यकता होती है NULL

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


4
नहीं, आप कुछ ओवरहेड से बचने के लिए लेन-देन रखना चाहते हैं।
पीटर आइसेनट्राट

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

4
बदल रहा है: कुछ और मुद्दों मैं में भाग BLOBमें BYTEA( stackoverflow.com/questions/3103242 ,) के लिए 0/1 बदल रहा BOOLEANकरने के लिए कॉलम '0' / '1', और टाल बाधाओं ( DEFERRABLE/ SET CONSTRAINTS ALL DEFERRED)।
निकोलस रिले

1
@ निचलोलैली: इसके लिए धन्यवाद। मैंने इसे एक सामुदायिक विकि के लिए दिया क्योंकि यह एक समूह प्रयास में बदल गया है, निष्पक्ष रूप से उचित है।
mu

2
आप पोस्टग्रे SQL में to_timestamp () का उपयोग कर एक टाइमस्टैम्प को एक progreSQL टाइमस्टैम्प में परिवर्तित कर सकते हैं
r03

61

pgloader

मैं इस पोस्ट के पार आया जब एक SQLite डंप को 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';

डॉक्स स्थिति की तरह । मैंने तब testdbसाथ बनाया createdb:

createdb testdb

मैंने pgloaderकमांड को इस तरह चलाया :

pgloader command

और फिर नए डेटाबेस से जुड़ा:

psql testdb

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

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


2
खबरदार कि (अभी भी समर्थित) उबंटू वितरण के पास पुराना संस्करण हो सकता है - v2.xy पहले से ही हटाए गए हैं और वास्तव में काम नहीं करते हैं। v3.2.x काम कर सकता है लेकिन v3.2.3 अनुशंसित है। मैंने खून बहने वाले किनारे से v3.2.3 प्राप्त किया है और sudo dpkg -i <.deb फ़ाइल नाम> के साथ स्थापित किया है , इसमें निर्भरता के साथ कोई समस्या नहीं थी।
सिलपोल

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

यह मेरा दिन बचा।
याकूब उबैदी

1
हाँ, जब मैं इस मुद्दे का सामना कर रहा था, तब मैं संघर्ष कर रहा था, और उस उपकरण ने इसे इतना आसान बना दिया ... कभी-कभी चीजें बस अच्छी तरह से काम करती हैं, न?
निकोर्लियस

धन्यवाद भाई। मैं इस जवाब को स्वीकार किए गए जवाब के लायक देखता हूं! बहुत अच्छा उपकरण।
मुहम्मद_

16

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

https://gist.github.com/2253099


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

12

अगली कड़ी मणि (एक रूबी पुस्तकालय) विभिन्न डेटाबेस भर को कॉपी डेटा प्रदान करता है: http://sequel.jeremyevans.net/rdoc/files/doc/bin_sequel_rdoc.html#label-Copy+Databases

पहले रूबी स्थापित करें, फिर मणि को चलाकर स्थापित करें gem install sequel

Sqlite के मामले में, यह इस तरह होगा: sequel -C sqlite://db/production.sqlite3 postgres://user@localhost/db


1
बहुत बढ़िया समाधान। के साथ चारों ओर fiddling की तुलना में बहुत आसान है pgloader
माइकेलडेवर

बिल्कुल, pgloader गन्दा है, जीसी विशाल डेटाबेस पर दुर्घटनाग्रस्त लगता है: github.com/dimitri/pgloader/issues/962
hasufell

7

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

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 

LONG प्रकार के लिए कोई जगह नहीं है, उदाहरण के लिए
yanothercoder

1
एक और आइटम जोड़ा जा सकता हैsed -e 's/DATETIME/TIMESTAMP/g'
सिलपोल

sed -e 's/TINYINT(1)/SMALLINT/g' - और सभी डेटा प्रकारों की तुलना के लिए stackoverflow.com/questions/1942586/…
पर्पलजकेट

मुझे एक SMALLINT के साथ भी एक समस्या थी जो sqlite में 't' या 'f' के लिए डिफ़ॉल्ट थी। स्पष्ट रूप से एक बूलियन, लेकिन एक सुरक्षित फिक्स की सिफारिश करने के लिए डीबी सिस्टम के साथ पर्याप्त परिचित नहीं है।
भूलभुलैया

1
:) के ' | sed -e 'साथ बदलें;
AstraSerg

0

मैंने संपादित करने की कोशिश की है / sqlite डंप regexping ताकि PostgreSQL इसे स्वीकार करता है, यह थकाऊ है और त्रुटि के लिए प्रवण है।

मुझे वास्तव में तेजी से काम करने के लिए क्या मिला:

पहले किसी भी डेटा के बिना पोस्टग्रेसीक्यूएल पर स्कीमा को फिर से बनाएँ, या तो डंप को संपादित करें या यदि आप एक ओआरएम का उपयोग कर रहे थे तो आप भाग्यशाली हो सकते हैं और यह बैक-एंड्स (sqlalchemy, peewee, ...) दोनों से बात करता है।

फिर पंडों का उपयोग करके डेटा को माइग्रेट करें। मान लें कि आपके पास एक बूल फ़ील्ड के साथ एक टेबल है (जो साइक्लाइट में 0/1 है, लेकिन PostgfSQL में टी / एफ होना चाहिए)

def int_to_strbool(df, column):
    df = df.replace({column: 0}, 'f')
    df = df.replace({column: 1}, 't')
    return df

#def other_transform(df, column):
#...

conn = sqlite3.connect(db)
df = pd.read_sql(f'select * from {table_name}', conn)

df = int_to_strbool(df, bool_column_name)
#df = other_transform(df, other_column_name)

df.to_csv(table_name + '.csv'), sep=',', header=False, index=False)

यह एक आकर्षण की तरह काम करता है, प्रत्येक फ़ंक्शन को लिखना, पढ़ना और डिबग करना आसान है, इसके विपरीत (मेरे लिए) नियमित अभिव्यक्ति।

अब आप परिणामी csv को PostgreSQL के साथ लोड करने की कोशिश कर सकते हैं (यहां तक ​​कि ग्राफिक रूप से व्यवस्थापक टूल के साथ), केवल कैविएट के साथ तालिकाओं को लोड करना होगा जिसके बाद आपको संबंधित स्रोत कुंजियों के साथ तालिकाओं को लोड करने के बाद विदेशी कुंजी के साथ तालिकाओं को लोड करना होगा। मेरे पास एक परिपत्र निर्भरता का मामला नहीं था, मुझे लगता है कि आप अस्थायी रूप से महत्वपूर्ण जाँच को निलंबित कर सकते हैं अगर ऐसा है।


-1

pgloader डेटाबेस को sqlite में पोस्टग्रेजेकल में बदलने पर अद्भुत काम करता है।

यहाँ एक स्थानीय sqlitedb को दूरस्थ PostgreSQL db में परिवर्तित करने पर एक उदाहरण दिया गया है:

pgloader sqlite.db postgresql: // उपयोगकर्ता नाम : पासवर्ड @ hostname / dbname


1
Pgloader बहुत छोटी गाड़ी है और अविश्वसनीय है। यह तुरंत त्रुटि के साथ दुर्घटनाग्रस्त हो जाता हैKABOOM! Control stack exhausted (no more space for function call frames).
Cerin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.