एक नई रेल परियोजना में SQLite से PostgreSQL में बदलें


125

मेरे पास एक रेल एप्लिकेशन है जो डेटाबेस SQLite (देव और उत्पादन) में हैं। जब से मैं उसके पास जा रहा हूँ, मैं अपने डेटाबेस को PostgreSQL में बदलना चाहता हूँ।

वैसे भी, मैंने सुना है कि स्थानीय, विकास, डेटाबेस को SQLite से बदलने की आवश्यकता नहीं है, इसलिए मुझे इसे बदलने की आवश्यकता नहीं है, फिर भी, मैं SQLite से PostgreSQL में उत्पादन वातावरण को बदलने के बारे में कैसे जाऊँ?

क्या पहले कभी किसी ने ऐसा किया है और मदद कर सकता है?

PS मुझे यकीन नहीं है कि वास्तव में इस प्रक्रिया को क्या कहा जाता है, लेकिन मैंने डेटाबेस को SQLite से PostgreSQL में स्थानांतरित करने के बारे में सुना है, यह है कि क्या करने की आवश्यकता है?


2
क्या आपके पास लाइव उत्पादन डेटा है जिसे इसके साथ जाने की आवश्यकता है, या यह एक नया / ताज़ा ऐप है?
डायलन मार्क जूल

19
मेरा सुझाव है कि आप अपने विकास के वातावरण को PostgreSQL में भी बदलें। SQLite और PostgreSQL (और हर दूसरे डेटाबेस) के बारे में अलग-अलग विचार हैं कि "वैध SQL" का क्या अर्थ है और कोई भी ORM आपको डेटाबेस के सभी आइडिएसिंक्रेसिस से नहीं हटा सकता है।
म्यू बहुत कम है

जवाबों:


101

आप अपने डेटाबेस को बदल सकते हैं। बॉक्स के बाहर एक का उपयोग करने के बजाय इसे बदल सकते हैं:

development:
  adapter: postgresql
  encoding: utf8
  database: project_development
  pool: 5
  username: 
  password:

test: &TEST
  adapter: postgresql
  encoding: utf8
  database: project_test
  pool: 5
  username: 
  password:

production:
  adapter: postgresql
  encoding: utf8
  database: project_production
  pool: 5
  username: 
  password:

cucumber:
  <<: *TEST

1
क्या मुझे Project_test या अपने डेटाबेस का नाम डालना चाहिए?
वासुसेथ

5
आप इसे जो चाहें नाम दे सकते हैं। यदि आपके प्रोजेक्ट का नाम 'कैलकुलेटर' है, तो मैं उन्हें कैलकुलेटर_प्रोडक्शन, कैलकुलेटर_टेस्ट, कैलकुलेटर_विकास
क्रिस बैरेट्टो जूल

2
@mmichael यह वास्तव में इस बात पर निर्भर करता है कि आपके पास आपके पोस्टग्रेज कैसे सेट किए गए हैं। यदि आप MacOS X Lion + पर हैं, तो postgres.app, शराब बनाना, या देशी का उपयोग करना उनके डिफ़ॉल्ट सेटअप पर अलग-अलग प्रतिबंध हैं। इसलिए यदि उपयोगकर्ता नाम और पासवर्ड लागू नहीं होते हैं, तो आप उन्हें छोड़ सकते हैं, या बिना किसी मान के साथ। यह विन्यास के 'कैच ऑल' प्रकार का अधिक था।
क्रिस बैरेट्टो

2
वहां (लाइन 9) में 9 & TEST ’क्या कर रहा है?
डेविड रोडेन

2
"TEST" विकल्पों के डिफ़ॉल्ट सेट के रूप में TEST सेट कर रहा है। बाद में उन्हें ओवरराइड किया जा सकता है या बस छोड़ दिया जा सकता है। "<<: * TEST" डिफ़ॉल्ट @DavidRhoden तक पहुंचने का रास्ता है
क्रिस

44

नीचे दिए गए चरणों ने मेरे लिए काम किया। यह नल का उपयोग करता है हरोकू द्वारा बनाई गई और रयान बेट्स के रेलसेक # 342 में उल्लेख किए मणि । कुछ कदम हैं, लेकिन यह पूरी तरह से काम करता है (यहां तक ​​कि तिथियां सही ढंग से माइग्रेट की गईं), और यह ओरेकल -> डीबी 2 या एसक्यूएल सर्वर -> ओरेकल माइग्रेशन से अतीत की तुलना में कहीं अधिक आसान था।

ध्यान दें कि SQLite में उपयोगकर्ता आईडी या पासवर्ड नहीं है, लेकिन टैप रत्न के लिए कुछ आवश्यक है। मैंने बस "उपयोगकर्ता" और "पासवर्ड" का उपयोग किया।

नए डेटाबेस के लिए Postgres डेटाबेस उपयोगकर्ता बनाएँ

$ createuser f3
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

EDIT - नीचे अद्यतन कमांड - इसके बजाय इसका उपयोग करें

$ createuser f3 -d -s

आवश्यक डेटाबेस बनाएँ

$ createdb -Of3 -Eutf8 f3_development
$ createdb -Of3 -Eutf8 f3_test

जेमफाइल को अपडेट करें

gem 'sqlite3'
gem 'pg'
gem 'taps'
$ bundle

डेटाबेस अद्यतन करें

#development:
#  adapter: sqlite3
#  database: db/development.sqlite3
#  pool: 5
#  timeout: 5000

development:
  adapter: postgresql
  encoding: unicode
  database: f3_development
  pool: 5
  username: f3
  password:

#test:
#  adapter: sqlite3
#  database: db/test.sqlite3
#  pool: 5
#  timeout: 5000

test:
  adapter: postgresql
  encoding: unicode
  database: f3_test
  pool: 5
  username: f3
  password:

Sqlite डेटाबेस पर टैप सर्वर शुरू करें

$ taps server sqlite://db/development.sqlite3 user password

डेटा माइग्रेट करें

$ taps pull postgres://f3@localhost/f3_development http://user:password@localhost:5000

रेल्स वेबसर्वर को पुनरारंभ करें

$ rails s

जेमफाइल की सफाई करें

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle

10

चूंकि आप हरोकू जा रहे हैं, आप ऐसा करने के लिए नल का उपयोग कर सकते हैं:

heroku db:push

यह आपके स्थानीय विकास साइक्लाइट डेटा को उत्पादन में धकेल देगा, और हरोकू आपके लिए पोस्टग्रेज को स्वचालित रूप से परिवर्तित कर देगा।

यह भी एक उत्पादन sqlite DB को heroku को धक्का देने के लिए काम करना चाहिए, लेकिन यह परीक्षण नहीं किया गया है।

RAILS_ENV=production heroku db:push

1
टैप्स मणि 1.9.3 के साथ अच्छी तरह से काम नहीं करता है, आपको इसे चलाने के लिए स्थानीय रूप से 1.9.2 स्थापित करने की आवश्यकता हो सकती है - एक बार जब मैंने किया कि यह माइंडब्लोइंग चिकनी github.com/ricardochimal/taps/issues/93 था
सब्मे

यह अब संभव नहीं है। अधिक जानकारी के लिए इस प्रश्न को देखें: stackoverflow.com/questions/19817851/…
sykaeh

5

आपको अपने रत्न के लिए " मणि" पृष्ठ '' पंक्ति जोड़ने की आवश्यकता होगी , '' पग '' रेल के लिए वर्तमान पोस्टग्रेज रत्न है।


5

बस config / database.yml फ़ाइल को अपडेट करें:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: projectname_development

test:
  <<: *default
  database: projectname_test

production:
  <<: *default
  database: projectname_production
  username: 
  password: 

आपके द्वारा चलाए जाने पर उपरोक्त क्या है:

$ rails new projectname --database=postgresql --skip-test-unit

इसे अपने जेमफाइल में भी जोड़ें:

gem 'pg'

5

अब सिंगल कमांड से इसकी राह आसान हो गई है

bin/rails db:system:change --to=postgresql

1
यह एक महान उत्तर है, यह आवश्यक मानों के साथ database.yml को बदलता है। आप अभी भी वहां जा सकते हैं और अपनी परियोजना के अनुसार डेटाबेस का नाम बदल सकते हैं।
13

3

मणि के 'sqlite3साथ मणि के स्थान पर मणि की जगह लेने के बाद pg, मैं हेरोकू sqlite3 errorमास्टर को धक्का देते हुए मिलता रहा क्योंकि मैं अद्यतन किए गए मणिभ को कम करना भूल गया था। बस निम्नलिखित हल कर रहा है:

git add .
git commit -m 'heroku push'
heroku create 
git push heroku master

3

बस आपको datatbase.yml अपडेट करें

development: &development
  adapter: postgresql
  database: Your_database_name
  username: user_name
  password: password
  host:     localhost
  schema_search_path: public
  min_messages: warning

test:
  <<: *development
  database: test_database_name

production:
  <<: *development
  database: production_db_name

हम रेल का उपयोग कर रहे हैं और बुनियादी मानकों का पालन करना चाहिए जैसे कि DRY, कन्वेंशन ओवर कॉन्फिगरेशन आदि। इसलिए उपरोक्त कोड में हम बार-बार एक ही कोड नहीं दोहरा रहे हैं।


2

यह मेरे ऊपर उल्लेख किया गया है, लेकिन मेरे पास इसे उत्थान करने में सक्षम होने के लिए एक लुकर के रूप में पर्याप्त प्रतिष्ठा नहीं है। इस उत्तर को पढ़ने वाले रेल्स के लिए थोड़ा और ध्यान आकर्षित करने की उम्मीद में:

आपको अपने रत्न के लिए "मणि" पृष्ठ '' पंक्ति जोड़ने की आवश्यकता होगी, '' पग '' रेल के लिए वर्तमान पोस्टग्रेज रत्न है।

^ ^ ^ यह डेटाबेस के अलावा एक महत्वपूर्ण टुकड़ा है। पोस्ट करने के लिए अपने रेल एप्लिकेशन को माइग्रेट करने के लिए चयनित उत्तर में वर्णित फ़ाइल का वर्णन करें।


1

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

defaults: &defaults
  adapter: <%= RUBY_ENGINE == 'ruby' ? 'postgresql' : 'jdbcpostgresql' %>
  encoding: unicode
  pool: 5
  timeout: 5000

development:
  database: project_development
  <<: *defaults

test:
  database: project_test
  <<: *defaults

production:
  database: project_production
  <<: *defaults



0

आज मेरा भी यही मुद्दा था। मैं रेल्स 4.2.8 पर काम कर रहा हूं। समाधान मेरे मामले में, pg रत्न संस्करण को निर्दिष्ट करता था 0.18.4

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.