এসকিউএলটি এসকিউএল ডাম্প ফাইলটিকে পোষ্টগ্রিজ এসকিউএলে রূপান্তর করুন


97

আমি পোস্টগ্রিজ এসকিউএল উত্পাদন সহ এসকিউএলটি ডাটাবেস ব্যবহার করে বিকাশ করছি। আমি সবেমাত্র আমার স্থানীয় ডাটাবেসকে প্রচুর পরিমাণে ডেটা দিয়ে আপডেট করেছি এবং একটি নির্দিষ্ট টেবিলটি উত্পাদন ডেটাবেসে স্থানান্তরিত করতে হবে।

চলমান উপর ভিত্তি করে sqlite database .dump > /the/path/to/sqlite-dumpfile.sql, এসকিউএলআইটি নিম্নলিখিত ফর্ম্যাটে একটি টেবিল ডাম্প আউটপুট করে:

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;

আমি কীভাবে উপরেরগুলিকে আমার প্রডাকশন সার্ভারে আমদানি করতে পারি এমন একটি পোস্টগ্রিজ এসকিউএল সামঞ্জস্যপূর্ণ ডাম্প ফাইলে রূপান্তর করব?


4
ঠিক আছে, যতক্ষণ না আমি স্ক্লাইটকে স্ক্লাইট 3 এ পরিবর্তন করি ততক্ষণ এই কমান্ডটি আমার পক্ষে কার্যকর হয়নি
সেলাল

উত্তর:


103

আপনার সেই ডাম্প ফাইলটি সরাসরি এতে ফিড করতে সক্ষম হওয়া উচিত psql:

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

যদি আপনি idকলামটি "স্বয়ংবৃদ্ধি" করতে চান তবে তার প্রকরণটি টেবিল তৈরির লাইনে "int" থেকে "সিরিয়াল" তে পরিবর্তন করুন। পোস্টগ্র্রেএসকিউএল তখন column কলামটিতে একটি অনুক্রম সংযুক্ত করবে যাতে ন্যূন আইডি সহ INSERT গুলি স্বয়ংক্রিয়ভাবে পরবর্তী উপলব্ধ মান নির্ধারিত হবে। পোস্টগ্রাএসকিউএল AUTOINCREMENTকমান্ডগুলি স্বীকৃতি দেবে না , সুতরাং এগুলি সরানো দরকার।

আপনি datetimeএসকিউএলাইট স্কিমাতে কলামগুলি পরীক্ষা করতে এবং সেগুলি timestampপোস্টগ্রেএসকিউএল- তে পরিবর্তন করতে চাইবেন । ( এটিকে নির্দেশ করার জন্য ক্লেকে ধন্যবাদ ।)

আপনি আপনার SQLite মধ্যে Booleans থাকে, তাহলে আপনি রূপান্তর করতে পারে 1এবং 0করতে 1::booleanএবং 0::boolean(যথাক্রমে) অথবা আপনি ডাম্প স্কিমা বিভাগে একটি পূর্ণসংখ্যা বুলিয়ান কলাম পরিবর্তন এবং তারপর তাদের আমদানি করার পরে পোস্টগ্রি ভিতরে হাত দ্বারা ঠিক পারে।

আপনার এসকিউএলাইটে যদি আপনার ব্লগ থাকে তবে আপনি ব্যবহারের জন্য স্কিমাটি সামঞ্জস্য করতে চাইবেন bytea। আপনার সম্ভবত কিছু decodeকলগুলিতেও মিশ্রিত হওয়া দরকার । আপনার পছন্দের ভাষায় একটি তাত্ক্ষণিক কপিরীয় লেখার জন্য এসকিউএল ম্যাঙ্গেলিংয়ের চেয়ে সহজ হতে পারে যদি আপনি অনেকগুলি ব্লক এর সাথে মোকাবিলা করেন LO

যথারীতি, যদি আপনার কাছে বিদেশী কী থাকে তবে আপনি সম্ভবত set constraints all deferredশৃঙ্খলাবদ্ধ সমস্যাগুলি সরাতে বা কমান্ডটি BEGIN / COMMIT জোড়ায় রেখে এড়াতে চাইবেন ।

বুলিয়ান, ব্লব এবং সীমাবদ্ধ নোটগুলির জন্য নিকোলাস রিলিকে ধন্যবাদ ।

আপনি যদি `আপনার কোড উপর, কিছু SQLite3 ক্লায়েন্টদের দ্বারা উৎপন্ন, আপনি তাদের সরিয়ে ফেলা আবশ্যক।

পোস্টগ্রিএসএসকিউএল unsignedকলামগুলিও স্বীকৃতি দেয় না , তাই আপনি এটিকে বাদ দিতে বা কাস্টম-তৈরি সীমাবদ্ধতা যুক্ত করতে চাইবেন:

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

SQLite অক্ষমতা মান নাল যদিও '', পোস্টগ্রি তাদের হিসাবে সেট করা প্রয়োজন NULL

এসকিউএলাইট ডাম্প ফাইলে সিনট্যাক্সটি বেশিরভাগ পোস্টগ্র্রেএসকিউএল এর সাথে সুসংগত বলে মনে হয় যাতে আপনি কয়েকটি জিনিস প্যাচ করতে এবং এতে ফিড করতে পারেন psql। এসকিউএল INSERT গুলি মাধ্যমে একটি বড় গাদা ডেটা আমদানি করতে কিছুটা সময় লাগতে পারে তবে এটি কার্যকর হবে।


4
না, আপনি কিছু ওভারহেড এড়াতে লেনদেন রাখতে চান।
পিটার আইসেন্ট্রাউট

4
এটি দুর্দান্ত কাজ করে। আমি আরও নোট করব যে আপনার যদি স্ক্লাইট datetimeকলামগুলি মাইগ্রেট করতে হয় তবে আপনাকে সেগুলি পোস্টগ্রিজের জন্য পরিবর্তন করতে হবে timestamp
ক্লে

4
পরিবর্তন: একটি আরো কয়েকটি বিষয় আমি গাড়ীতে আঘাত BLOBমধ্যে BYTEA( stackoverflow.com/questions/3103242 ,) জন্য 0/1 পরিবর্তন BOOLEANকরতে কলাম '0' / '1', এবং পিছিয়ে সীমাবদ্ধতার ( DEFERRABLE/ SET CONSTRAINTS ALL DEFERRED)।
নিকোলাস রিলে

4
@ নিকোলাসরিলে: তার জন্য ধন্যবাদ আমি এটি একটি সম্প্রদায় উইকিকে দিয়েছি যেহেতু এটি একটি গোষ্ঠী প্রচেষ্টায় রূপান্তরিত হয়েছে, ন্যায্য ন্যায্য।
মিউ খুব ছোট

4
আপনি টাইমস্ট্যাম্পটিকে একটি অগ্রগতি এসকিউএল টাইমস্ট্যাম্পে রূপান্তর করতে পোস্টগ্রিএসএসকিউলে টু টাইমস্ট্যাম্প () ব্যবহার করতে পারেন
r03

62

pgloader

এসকিউএলাইট ডাম্প পোস্টগ্র্রেএসকিউএলে রূপান্তর করার উপায় অনুসন্ধান করার সময় আমি এই পোস্টটি জুড়ে এসেছি। যদিও এই পোস্টটির একটি স্বীকৃত উত্তর রয়েছে (এবং এটি +1 এ ভাল) তবে আমি মনে করি এটি যুক্ত করা গুরুত্বপূর্ণ।

আমি এখানে সমাধানগুলি সন্ধান করতে শুরু করেছি এবং বুঝতে পেরেছি যে আমি আরও স্বয়ংক্রিয় পদ্ধতি আবিষ্কার করছি। আমি উইকি ডক্সটি সন্ধান করেছি:

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

এবং আবিষ্কার pgloader। খুব দুর্দান্ত অ্যাপ্লিকেশন এবং এটি ব্যবহার করা তুলনামূলকভাবে সহজ। আপনি ফ্ল্যাট এসকিউএল ফাইলটি একটি ব্যবহারযোগ্য পোস্টগ্রিজ এসকিউএল ডাটাবেসে রূপান্তর করতে পারেন। আমি পরীক্ষার ডিরেক্টরি থেকে এটি ইনস্টল করেছিলাম *.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';

ডক্স রাজ্যের মতো like আমি তখন এটি testdbদিয়ে একটি তৈরি করেছি createdb:

createdb testdb

আমি pgloaderকমান্ডটি এভাবে চালিয়েছি:

pgloader command

এবং তারপরে নতুন ডাটাবেসের সাথে সংযুক্ত:

psql testdb

ডেটা পরীক্ষা করার জন্য কিছু প্রশ্নের পরে, এটি বেশ ভালভাবে কাজ করেছে বলে মনে হয়। আমি জানি আমি যদি এই স্ক্রিপ্টগুলির মধ্যে একটি চালানোর চেষ্টা করেছি বা এখানে উল্লিখিত ধাপে ধাপে রূপান্তরটি করতে পারি, তবে আমি আরও অনেক বেশি সময় ব্যয় করতে পারতাম।

ধারণাটি প্রমাণ করার জন্য আমি এটিকে ফেলে দিয়েছি testdbএবং একটি প্রোডাকশন সার্ভারে ডেভলপমেন্ট পরিবেশে আমদানি করেছি এবং ডেটা সুন্দরভাবে স্থানান্তরিত করেছি।


4
সাবধান থাকুন (এখনও সমর্থিত) উবুন্টু বিতরণগুলির পুরানো সংস্করণ থাকতে পারে - v2.xy ইতিমধ্যে অবচিত হয়ে গেছে এবং আসলে কাজ করে না। v3.2.x কাজ করতে পারে তবে v3.2.3 বাঞ্ছনীয়। আমি রক্তপাত প্রান্ত থেকে v3.2.3 এনেছি এবং sudo dpkg -i <.deb ফাইলের নাম> দিয়ে ইনস্টল করেছি , এটি নির্ভরতা নিয়ে কোনও সমস্যা ছিল না।
সিলপোল

আমি @ সিলপোলের সাথে একমত - সর্বশেষতম স্থিতিশীল রিলিজটি ডাউনলোড এবং আপনার ফেভ প্যাকেজ ম্যানেজার ব্যবহার করে ইনস্টল করতে ভুলবেন না; "কমান্ড" ফাইলের জন্য এটি কেবলমাত্র 'কমান্ড' নামক একটি টেক্সট ফাইল যার কোনও এক্সটেনশন নাম নেই (অর্থাত্ ফাইল নামের শেষে .txt এর প্রয়োজন নেই) আপনার ফাইলের নাম কৌণিক বন্ধনীতে লাগাতে হবে না; আমার ডেটা দেখার জন্য আমাকে পিএসকিএল ডাটাবেসের অনুসন্ধান_পর্বটি পরিবর্তন করতে হয়েছিল; পিগলোডার ভাল কাজ করেছে এবং আমাকে অনেক ঝামেলা বাঁচিয়েছে
বিকেএসপুরজন

এই আমার দিন বাঁচা।
ইয়াকব উবাইদী

4
হ্যাঁ, আমি যখন এই সমস্যার মুখোমুখি হয়েছিলাম তখন আমি লড়াই করে যাচ্ছিলাম, এবং সেই সরঞ্জামটি এটিকে এত সহজ করে তুলেছিল ... কখনও কখনও জিনিসগুলি কেবল সুন্দরভাবে কাজ করে, তাই না?
নিকোরেলিয়াস

ধন্যবাদ ভাই. আমি এই উত্তর গ্রহণযোগ্য উত্তর হতে মূল্য! খুব ভাল সরঞ্জাম।
মোহাম্মদ_18

16

আমি কি একটি স্ক্রিপ্ট লিখেছিলেন sqlite3করার postgresমাইগ্রেশন। এটি https://stackoverflow.com/a/4581921/1303625 এ উল্লিখিত সমস্ত স্কিমা / ডেটা অনুবাদগুলিকে পরিচালনা করে না , তবে এটির যা করার দরকার তা এটি করে। আশা করি এটি অন্যদের জন্য একটি ভাল সূচনা পয়েন্ট হবে।

https://gist.github.com/2253099


4
এটি ভাল কাজ করে! আমি গিস্টটি
পিটারিনো

14

পরিণাম মণি (ক রুবি লাইব্রেরি) বিভিন্ন ডাটাবেস জুড়ে ডেটা প্রতিলিপি দিচ্ছে: http://sequel.jeremyevans.net/rdoc/files/doc/bin_sequel_rdoc.html#label-Copy+Databases

প্রথমে রুবি ইনস্টল করুন, তারপরে দৌড় দিয়ে রত্নটি ইনস্টল করুন gem install sequel

স্ক্লাইটের ক্ষেত্রে এটি এমন হবে: sequel -C sqlite://db/production.sqlite3 postgres://user@localhost/db


4
Awesome solution. Much easier than fiddling around with pgloader.
michaeldever

Absolutely, pgloader is messy, the GC seems to crash on huge databases: github.com/dimitri/pgloader/issues/962
hasufell

Feel free to post your answer at stackoverflow.com/questions/6148421/… where I copied your answer. Then ping me and I will revoke my answer if you want the reps for it.
Felix

@ ফেলিক্স ধন্যবাদ! আপনি ক্রেডিট নিতে পারেন। আপনি কি চারদিকে ডিবি রেফারেন্সের ক্রমটি বদল করতে পারেন (যেহেতু এটি এসকিউলাইটে পিজি চায়), ও আমার আইডিতে আরও একটি "লা" যুক্ত করতে পারে। উত্তরটি আরও কম সহায়ক হতে পারে যদিও এর জন্য তাদের ডিভ মেশিনে পিজি ইনস্টল করা প্রয়োজন, এবং এই মুহুর্তে তারা কেবল বিকাশের জন্য পিজি ব্যবহার করবে।
লুলালালা

@ লুলালালা ধন্যবাদ ওটা করেছিলাম. তবে যুক্তি সম্পর্কে আমি একমত নই। তারা যেমন লিনাক্স মেশিনে ডিবি রূপান্তর করতে পারে এবং তারপরে এটি ডিভাইসটিতে অনুলিপি করতে পারে (স্ক্লাইট ডিবি ফাইল হিসাবে)। তবে যাইহোক যাইহোক এটির একটি খারাপ ধারণা :) তবে সিক্যুয়েল আমার বাড়াটিকে এখানে একটি বাজে পরিস্থিতিতে সংরক্ষণ করেছিল।
ফেলিক্স

7

আপনি একটি লাইনার ব্যবহার করতে পারেন, সেড কমান্ডের সাহায্যে এটি একটি উদাহরণ:

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 

there is no replace for LONG type, e.g.
yetanothercoder

1
one more item could be added sed -e 's/DATETIME/TIMESTAMP/g'
silpol

sed -e 's/TINYINT(1)/SMALLINT/g' -- and for a comparison of all the data types see stackoverflow.com/questions/1942586/…
Purplejacket

আমার একটি ছোট ছোট সমস্যাও ছিল যা স্ক্লাইটে 't' বা 'f' এ ডিফল্ট হয়েছিল। স্পষ্টতই একটি বুলিয়ান, তবে কোনও নিরাপদ ফিক্সের সুপারিশ করার জন্য ডিবি সিস্টেমের সাথে যথেষ্ট পরিচিত নয়।
গোলকধাঁধা

4
:) এর ' | sed -e 'সাথে প্রতিস্থাপন করুন;
অ্যাস্ট্রা সার্গ

0

আমি স্ক্লাইট ডাম্পটিকে সম্পাদনা / পুনর্নির্মাণের চেষ্টা করেছি যাতে পোস্টগ্র্যাস এসকিউএল এটি গ্রহণ করে, এটি ক্লান্তিকর এবং ত্রুটির প্রবণ।

আমি সত্যিই দ্রুত কাজ করতে পেলাম কী:

প্রথমে কোনও ডেটা ছাড়াই পোস্টগ্রেএসকিউএলে স্কিমাটি পুনরায় তৈরি করুন, হয় ডাম্প সম্পাদনা করুন বা আপনি যদি একটি ওআরএম ব্যবহার করে থাকেন তবে আপনি ভাগ্যবান হতে পারেন এবং এটি উভয় পিছনের দিকের সাথে কথা বলে (স্ক্ল্যাচচেমি, পিল, ...)।

তারপরে পান্ডা ব্যবহার করে ডেটা স্থানান্তর করুন। ধরুন আপনার কাছে একটি বুল ক্ষেত্রের সাথে একটি টেবিল রয়েছে (যা স্ক্লাইটে 0/1, তবে পোস্টগ্রিজ এসকিউএল এ অবশ্যই টি / এফ হতে হবে)

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)

এটি একটি কবজির মতো কাজ করে, প্রতিটি ফাংশন লিখতে, পড়তে এবং ডিবাগ করা সহজ, নিয়মিত প্রকাশের (আমার পক্ষে) বিপরীতে।

এখন আপনি পোস্টগ্রেএসকিউএল (এমনকি গ্রাফিকভাবে অ্যাডমিন সরঞ্জাম সহ) এর ফলে প্রাপ্ত সিএসভি লোড করার চেষ্টা করতে পারেন, কেবলমাত্র উত্সাহের সাথে আপনি সংশ্লিষ্ট উত্স কীগুলির সাহায্যে টেবিলগুলি লোড করার পরে বিদেশী কী দিয়ে টেবিলগুলি লোড করতে হবে। আমার কাছে একটি বিজ্ঞপ্তি নির্ভরতার কেস নেই, আমি অনুমান করি যে আপনি যদি সেই সমস্যাটি থেকে থাকেন তবে কী পরীক্ষাটি সাময়িকভাবে স্থগিত করতে পারেন।


-2

পিগ্লোডার ওয়ার্কসটি স্ক্লাইটে ডেটাবেসকে পোস্টগ্রেএসএলএল রূপান্তর করার জন্য আশ্চর্য হয়ে যায়।

স্থানীয় স্ক্যালিটেডবকে একটি দূরবর্তী পোস্টগ্রাইএসকিউএল ডিবিতে রূপান্তর করার উদাহরণ এখানে রয়েছে:

pgloader sqlite.db postgresql: // ব্যবহারকারীর নাম : পাসওয়ার্ড @ হোস্টনাম / ডিবি নাম


4
Pgloader মারাত্মক বগি এবং অবিশ্বাস্য। এটি তাত্ক্ষণিকভাবে ত্রুটির সাথে ক্র্যাশ হয়ে গেছেKABOOM! Control stack exhausted (no more space for function call frames).
সেরিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.