เปลี่ยนจาก SQLite เป็น PostgreSQL ในโครงการ Rails ใหม่


124

ฉันมีแอพทางรถไฟที่ฐานข้อมูลอยู่ใน SQLite (การพัฒนาและการผลิต) เนื่องจากฉันกำลังย้ายไปที่ heroku ฉันต้องการแปลงฐานข้อมูลของฉันเป็น PostgreSQL

อย่างไรก็ตามฉันได้ยินมาว่าการพัฒนาฐานข้อมูลในพื้นที่ไม่จำเป็นต้องเปลี่ยนจาก SQLite ดังนั้นฉันจึงไม่จำเป็นต้องเปลี่ยนสิ่งนั้นอย่างไรก็ตามฉันจะเปลี่ยนสภาพแวดล้อมการผลิตจาก SQLite เป็น PostgreSQL ได้อย่างไร

มีใครเคยทำแบบนี้มาก่อนและสามารถช่วยได้หรือไม่?

ปล. ฉันไม่แน่ใจว่ากระบวนการนี้เรียกว่าอะไรกันแน่ แต่ฉันเคยได้ยินเกี่ยวกับการย้ายฐานข้อมูลจาก SQLite ไปยัง PostgreSQL สิ่งที่ต้องทำคืออะไร?


2
คุณมีข้อมูลการผลิตสดที่จำเป็นต้องใช้หรือเป็นแอปใหม่ / ใหม่
Dylan Markow

19
ฉันขอแนะนำให้คุณเปลี่ยนสภาพแวดล้อมการพัฒนาของคุณเป็น PostgreSQL ด้วย SQLite และ PostgreSQL (และฐานข้อมูลอื่น ๆ ทั้งหมด) มีแนวคิดที่แตกต่างกันเกี่ยวกับความหมายของ "SQL ที่ถูกต้อง" และไม่มี ORM ใดสามารถป้องกันคุณจากความแตกต่างของฐานข้อมูลทั้งหมด
สั้นเกินไป

คำตอบ:


101

คุณสามารถเปลี่ยน database.yml ของคุณเป็นสิ่งนี้แทนการใช้ sqlite one นอกกรอบ:

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 หรือชื่อฐานข้อมูลของฉัน?
Vasseurth

5
คุณสามารถตั้งชื่ออะไรก็ได้ที่คุณต้องการ ถ้าชื่อโปรเจ็กต์ของคุณคือ 'เครื่องคิดเลข' ฉันจะตั้งชื่อพวกเขาว่า Calculator_production, Calculator_test, Calculator_development
Chris Barretto

2
@mmichael มันขึ้นอยู่กับว่าคุณตั้งค่า postgres ไว้อย่างไร การใช้ postgres.app, brew หรือ native หากคุณใช้ MacOS X Lion + จะมีข้อ จำกัด ที่แตกต่างกันในการตั้งค่าเริ่มต้น ดังนั้นหากใช้ชื่อผู้ใช้และรหัสผ่านไม่ได้คุณสามารถปล่อยทิ้งไว้หรือไม่ใส่ค่าก็ได้ นี่เป็นเพียงการกำหนดค่าประเภท "จับทั้งหมด" มากกว่า
Chris Barretto

2
'& TEST' กำลังทำอะไรอยู่ที่นั่น (บรรทัดที่ 9)
David Rhoden

2
"& TEST" กำลังตั้งค่า TEST เป็นชุดตัวเลือกเริ่มต้น สามารถลบล้างได้ในภายหลังหรือทิ้งไว้ "<<: * TEST" เป็นวิธีเข้าถึงค่าเริ่มต้น @DavidRhoden
Chris Barretto

44

ขั้นตอนด้านล่างใช้ได้ผลสำหรับฉัน มันใช้ก๊อกอัญมณีสร้างโดย Heroku และกล่าวถึงใน Railscast ของ Ryan Bates # 342 มีขั้นตอนไม่กี่ขั้นตอน แต่ทำงานได้อย่างสมบูรณ์ (แม้กระทั่งวันที่ก็ถูกโยกย้ายอย่างถูกต้อง) และง่ายกว่าการย้าย Oracle -> DB2 หรือ SQL Server -> Oracle ที่ฉันเคยทำในอดีตมาก

โปรดทราบว่า SQLite ไม่มี ID ผู้ใช้หรือรหัสผ่าน แต่อัญมณีการแตะต้องมีบางอย่าง ฉันเพิ่งใช้ตัวอักษร "ผู้ใช้" และ "รหัสผ่าน"

สร้างผู้ใช้ฐานข้อมูล 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

แก้ไข - คำสั่งที่อัปเดตด้านล่าง - ใช้สิ่งนี้แทน

$ createuser f3 -d -s

สร้างฐานข้อมูลที่ต้องการ

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

อัปเดต Gemfile

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

อัปเดต database.yml

#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:

เริ่มเซิร์ฟเวอร์ taps บนฐานข้อมูล sqlite

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

ย้ายข้อมูล

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

รีสตาร์ทเว็บเซิร์ฟเวอร์ Rails

$ rails s

ล้างข้อมูล Gemfile

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

10

เนื่องจากคุณกำลังจะย้ายไปที่ heroku คุณสามารถใช้การแตะเพื่อทำสิ่งนี้:

heroku db:push

สิ่งนี้จะผลักดันข้อมูล sqlite การพัฒนาในพื้นที่ของคุณไปสู่การผลิตและ heroku จะแปลงเป็น postgres ให้คุณโดยอัตโนมัติ

สิ่งนี้ควรใช้เพื่อผลักดัน sqlite db ที่ใช้งานจริงไปยัง heroku แต่ยังไม่ได้ทดสอบ

RAILS_ENV=production heroku db:push

1
ดูเหมือนว่าอัญมณีก๊อกจะใช้งานได้ไม่ดีกับ 1.9.3 คุณอาจต้องติดตั้ง 1.9.2 ในเครื่องเพื่อให้มันทำงานได้ - เมื่อฉันทำเช่นนั้นมันก็ราบรื่นอย่างเหลือเชื่อ github.com/ricardochimal/taps/issues/93
sbeam

นี้เป็นไปไม่ได้อีกต่อไป ดูคำถามนี้สำหรับข้อมูลเพิ่มเติม: stackoverflow.com/questions/19817851/…
sykaeh


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

เพิ่มสิ่งนี้ใน Gemfile ของคุณด้วย:

gem 'pg'

5

ตอนนี้กลายเป็นเรื่องง่ายด้วยคำสั่งเดียว

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

1
นี่คือคำตอบที่ดีมันเปลี่ยน database.yml ด้วยค่าที่จำเป็น คุณยังสามารถเข้าไปที่นั่นและเปลี่ยนชื่อฐานข้อมูลตามโครงการของคุณได้
csalmeida

3

หลังจากเปลี่ยน gem 'sqlite3ด้วย gem pgใน gemfile แล้วฉันยังคงได้รับsqlite3 errorเมื่อกดไปที่ Heroku master เพราะฉันลืมส่ง gemfile ที่อัพเดต เพียงทำสิ่งต่อไปนี้จะแก้ไขสิ่งนี้ได้:

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, Convention over Configuration เป็นต้นดังนั้นในโค้ดด้านบนเราจะไม่ใช้รหัสเดิมซ้ำแล้วซ้ำอีก


2

มีคนกล่าวไว้ข้างต้นฉัน แต่ฉันไม่มีชื่อเสียงมากพอในฐานะคนขี้เกียจที่จะโหวตให้คะแนนได้ ด้วยความหวังว่าจะดึงดูดความสนใจเพิ่มขึ้นเล็กน้อยสำหรับมือใหม่ Rails อ่านคำตอบนี้:

คุณจะต้องเพิ่มบรรทัด "gem" pg "" ลงใน gemfile ของคุณโดย "pg" เป็นอัญมณี postgres ปัจจุบันสำหรับ Rails

^^^ นี่คือส่วนสำคัญนอกเหนือจากไฟล์ database.yml ที่อธิบายไว้ในคำตอบที่เลือกเพื่อย้ายแอป Rails ไปยัง Postgres


1

นี่คือวิธีการตั้งค่าของฉัน หากคุณใช้ MRI เท่านั้นไม่ใช่ Jruby คุณสามารถข้ามตรรกะในการตั้งค่าอะแดปเตอร์ได้

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

วันนี้ฉันมีปัญหาเดียวกัน ฉันกำลังทำงานกับ Rails 4.2.8 วิธีแก้คือระบุรุ่น PG 0.18.4อัญมณีในกรณีของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.