Saya melihat pertanyaan ini sebelumnya, tetapi hanya untuk rspec. Saya belum membuat tes karena terlalu canggih untuk saya tetapi suatu hari saya akan segera! : P
Saya mendapatkan kesalahan ini ketika saya mencoba untuk mendaftar / masuk ke aplikasi saya. Saya menggunakan perangkat untuk membuat pengguna dan juga omniauth2 untuk masuk dengan google .
ini adalah kesalahannya
ActiveRecord::StatementInvalid at /users/auth/google_oauth2/callback
PG::UndefinedTable: ERROR: relation "users" does not exist
LINE 5: WHERE a.attrelid = '"users"'::regclass
^
: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
FROM pg_attribute a LEFT JOIN pg_attrdef d
ON a.attrelid = d.adrelid AND a.attnum = d.adnum
WHERE a.attrelid = '"users"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
Saya mencoba rake db:migrate
, tetapi sudah dibuat: dalam tabel skema pengguna ada. Adakah yang pernah mendapatkan kesalahan ini sebelumnya?
database.yml
config = / opt / local / lib / postgresql84 / bin / pg_config
development:
adapter: postgresql
encoding: unicode
database: tt_intraweb_development
pool: 5
username: my_username
password:
test:
adapter: postgresql
encoding: unicode
database: tt_intraweb_test
pool: 5
username: my_username
password:
production:
adapter: postgresql
encoding: unicode
database: tt_intraweb_production
pool: 5
username: my_username
password:
RAILS_ENV=test rake db:migrate
bekerja untuk saya.Jawaban:
Pada awalnya, Anda harus melepaskan semua koneksi dari database. Secara default Anda menggunakan lingkungan pengembangan . Kemudian coba setel ulang database dengan yang berikut ini:
rake db:reset
Jika triknya tidak membantu, jatuhkan database, lalu buat kembali, migrasikan data, dan jika Anda memiliki benih, taburkan database:
rake db:drop db:create db:migrate db:seed
atau singkatnya (sejak 3.2):
rake db:migrate:reset db:seed
Karena
db:migrate:reset
menyiratkan drop, buat dan migrasikan db. Karena lingkungan default untukrake
adalah pengembangan , jika Anda melihat pengecualian dalam pengujian spesifikasi, Anda harus membuat ulang db untuk lingkungan pengujian sebagai berikut:RAILS_ENV=test rake db:drop db:create db:migrate
atau hanya dengan memuat skema yang dimigrasi:
RAILS_ENV=test rake db:drop db:create db:schema:load
Dalam kebanyakan kasus, database pengujian disemai selama prosedur pengujian, jadi
db:seed
tindakan tugas tidak perlu diteruskan. Jika tidak, Anda harus menyiapkan database (ini tidak digunakan lagi di Rails 4 ):rake db:test:prepare
dan kemudian (jika memang diperlukan):
RAILS_ENV=test rake db:seed
Pada versi Rails yang lebih baru, kesalahan ActiveRecord :: NoEnvironmentInSchemaError mungkin muncul, jadi cukup tambahkan tugas dengan set lingkungan database tugas: db: environment: set :
RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate
sumber
rake db:test:prepare
melakukan pekerjaan itu.rake db:reset
. Keajaiban terjadi man!Saya mengalami kesalahan ini, dan setelah penelitian saya, menemukan bahwa salah satu alasan pengguna relasi kesalahan tidak terdefinisi PG tidak ada kesalahan adalah:
Kesalahan ini adalah kesalahan migrasi. Anda mungkin telah membuat model baru dengan beberapa atribut database. Setelah membuat model, Anda harus memigrasi atribut ke skema aplikasi rails Anda.
Jika Anda menggunakan mesin lokal, untuk pengembangan, Anda dapat menggunakan perintah
rake db:migrate
Jika Anda menggunakan heroku
heroku run rake db:migrate
sumber
rake db:migrate
. Terima kasih.Database pengujian Anda belum siap untuk rspec.
Siapkan database pengujian Anda untuk rspec guna memperbaiki kesalahan ini
RAILS_ENV=test rake test:prepare
Ini akan menjatuhkan, membuat dan menambahkan migrasi ke database pengujian Anda
Jika tugas rake dibatalkan dengan pesan seperti 'PG :: Error: ERROR: database "[your_db_test]" sedang diakses oleh pengguna lain, jalankan yang ini
RAILS_ENV=test rake db:migrate
sumber
Saya mengalami kesalahan serupa. Akar kesalahan saya adalah bahwa saya memiliki referensi ke model Rails di file pabrik.rb saya. Jadi itu menyebabkan masalah kesalahan pemuatan. Perbaikannya adalah membungkus referensi dalam satu blok atau
{}
sehingga menunda menjalankannya.Berikut adalah kode RUSAK:
FactoryGirl.define do factory :user do guid User.new.send(:new_token) end end
Dan terjadi error karena
User
tidak ditentukan saat factory.rb sedang dimuat. Saya membungkusUser.new
panggilan dalam satu blok dan itu menyelesaikan masalah:Kode tetap:
FactoryGirl.define do factory :user do guid { User.new.send(:new_token) } end end
Catatan: mungkin bukan praktik terbaik untuk perlu memanggil model Anda seperti ini, tetapi itu adalah solusi untuk MENGERINGKAN kode saya.
sumber
Saya mendapatkan kesalahan ini juga saat menjalankan rspec:
Failure/Error: it { expect(subject.priority_list).to eq [nil] * 9 } ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "priorities" does not exist LINE 5: WHERE a.attrelid = '"priorities"'::regclass ...
Itu terselesaikan untukku setelah aku lari
rake db:test:prepare rake db:test:load
sumber
Ini sering disebabkan oleh bug di ActiveAdmin. Berikut cara mengatasi bug tersebut:
Jika Anda menggunakan ActiveAdmin, tabel mana pun yang dikatakan PG tidak ada, beri komentar konten file rb ActiveAdmin itu.
Misalnya, untuk kasus ini
PGError: ERROR: relation "users" does not exist
, komentari seluruh kontenapp/admin/users.rb
, kemudian hapus komentar setelah Anda melakukan migrasi.sumber
Masalah itu bagi saya disebabkan oleh rel Factory Girl. Saya akan merekomendasikan bagi mereka yang menggunakannya untuk mengganti nama folder spesifikasi / pabrik menjadi spesifikasi / temp dan mencoba
RAILS_ENV = paket lingkungan_Anda exec rake db: migrate --trace
Jika lolos, maka Anda baru menemukan apa yang menyebabkannya. Penggalian cepat melalui repo github permata Factory Girl Rails membantu saya mengidentifikasi masalah.
Pabrik gagal karena saya mencoba membuat contoh Model yang tidak ada saat dijalankan! Contoh kode di bawah ini:
FactoryGirl.define do factory :billing_product, class: 'Billing::Product' do name Faker::Cat.name product_type 'fuel' active true payment_options [Billing::PaymentOption.new(term: 1, payment_term: 1)] end end
Mengenkapsulasi Array dalam sebuah blok (menambahkan {}) melakukan perbaikan untuk saya. Perhatikan bahwa payment_options dapat mengambil lebih dari satu opsi pembayaran dalam contoh ...
payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}
Lihat bagian Dynamic Attributes dari dokumen Factory Girl Rails untuk info selengkapnya.
Jangan lupa untuk mengganti nama folder pabrik Anda kembali!
sumber
Saya menghadapi masalah yang sama dan kemudian saya menemukan solusi berikut.
Pastikan Anda telah memasukkan semua kredensial berikut di file database.yml dan sudah benar:
development: adapter: postgresql encoding: unicode database: my_database host: localhost port: 5432 pool: 5 username: postgres password: xyz test: adapter: postgresql encoding: unicode database: my_test_database host: localhost port: 5432 pool: 5 username: postgres password: xyz
sumber
Saya mengalami masalah ini setelah saya menghapus tabel pengguna. solusi berubah
change_table(:users)
untuk
create_table(:users)
sumber
::Migration[5.0]
hilang dalam migrasi. bukannya melemparkan kesalahan sintaks melemparsetelah membuang waktu berjam-jam akhirnya saya menemukan bahwa migrasi hilang
::Migration[5.0]
.Migrasi yang Salah:
class CreateRoles < ActiveRecord # <---- Pay attention def change create_table :roles do |t| t.string :name t.integer :code, limit: 2 t.boolean :is_active, default: true t.timestamps end end end
Migrasi Tetap dan Benar
class CreateRoles < ActiveRecord::Migration[5.0] def change create_table :roles do |t| t.string :name t.integer :code, limit: 2 t.boolean :is_active, default: true t.timestamps end end end
Ini bisa menjadi bug dengan rel dan mungkin membantu seseorang, alih-alih berjuang dan bertanya-tanya.
sumber
Saya mendapatkan kesalahan serupa saat mencoba menjalankan tes menggunakan rspec.
Saya mengikuti langkah Малъ Скрылевъ tapi tetap saja tidak. Langkah terakhir yang perlu saya lakukan adalah memuat skema saya ke dalam database pengujian saya menggunakan:
RAILS_ENV=test rake db:schema:load
Setelah itu masalahnya hilang dan saya bisa melanjutkan ke bug berikutnya. Semoga itu memberi Anda wawasan.
sumber
Hapus folder Admin dan jalankan rake lagi.
sumber
(Saya tahu ini sudah tua, tetapi untuk calon karyawan Google)
Apakah Anda menggunakan
devise
? Saya tahu secara spesifikomniauthable
sebuah masalah, tapi mungkin juga masalah lain. Tidak harus seperti itudevise
. Umumnya solusinya adalah dengan mengomentari model yang melanggar, kelas, apa pun, dan hapus komentar di bagian mana pun yang ditanyakan kesalahan.Bagi saya, yang terjadi adalah
devise
membacaUser
model untuk melihat apa yang Anda miliki sebagai argumen untukdevise
(metode kelas yaitudevise :database_authenticatable, :registerable #etc
)Tapi, itu akan membaca seluruh file dan jika ini bukan proyek baru, itu mungkin tersandung oleh metode kelas lain mengandalkan hal-hal lain (dalam kasus saya itu adalah
friendly_id
permata, dan kemudianalias_method
Jawabannya adalah mengomentari
User
model kecuali untukdevise
baris * danrake db:schema:load
akan berfungsi dengan baik.jika tidak, saya mendapat kesalahan ini:
ArgumentError: Memetakan omniauth_callbacks pada sumber daya yang bukan omniauthable Harap tambahkan
devise :omniauthable
keUser
modelsumber
Jika Anda mendapatkan kesalahan ini saat bermigrasi, pastikan nama model Anda jamak
misalnya.
add_column :images, :url, :string
sumber
Penyebab yang paling mungkin adalah rake Anda menggunakan lingkungan yang berbeda dari database.yml daripada server web Anda.
sumber
Saya mengalami masalah ini dan ternyata itu disebabkan oleh Grape API . Saya melihat di pelacakan tumpukan bahwa file rute sedang dibaca selama migrasi.
Di routes.rb Grape api dipasang
mount API::Base => '/'
Dan di API ada referensi ke model yang hilang. Jadi, berkat jawaban ini saya memasukkannya ke dalam blok yang mendeteksi apakah dijalankan oleh server atau selama migrasi.
unless ( File.basename($0) == "rake" && ARGV.include?("db:migrate") ) mount API::Base => '/' end
Dan itu berhasil.
sumber
Saya mengalami kesalahan berikut dan melakukan pencarian ke semua kode aplikasi saya karena
type_zones
saya tidak dapat menemukannya. Saya juga melihat db dan itu diperbarui.Ternyata itu adalah file di bawah perlengkapan
/test/fixtures/type_zones.yml
yang menyebabkan masalah.ERROR["test_should_get_new", UsersControllerTest, 0.47265757399145514] test_should_get_new#UsersControllerTest (0.47s) ActiveRecord::StatementInvalid: ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "type_zones" does not exist LINE 1: DELETE FROM "type_zones" ^ : DELETE FROM "type_zones"
sumber
Bagi siapa pun yang masih mengalami masalah ini, dalam kasus saya, itu adalah pabrik saya di FactoryGirl yang memicu kesalahan ini.
Saya mencoba menambahkan referensi melalui '.new' atau '.create'.
sumber
Dalam kasus saya, saya harus mengomentari 2
ActiveAdmin
file. Inilah langkah saya:Solr
pada proyek ini):⇒ rkdbm java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) => Solr is already running rake aborted! PG::UndefinedTable: ERROR: relation "discussions" does not exist LINE 5: WHERE a.attrelid = '"discussions"'::regclass ^ : SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"discussions"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:25:in
block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:1:in
' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:3:inblock in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:1:in
' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/environment.rb:5:in `' Tasks: TOP => db:migrate => environment (See full trace by running task with --trace)Saya mengomentari
app/admin/discussions.rb
file sesuai jawaban Arcolye di atas dan mencoba memigrasi database saya lagi.Kesalahan yang sama.
Saya melihat stacktrace sedikit lebih dekat, dan memperhatikan bahwa sebenarnya
app/admin/users.rb:25
sedang melemparkan pengecualian - dan tentu saja, file itu memiliki ketergantungan padadiscussions
tabel saya (melalui mengeksekusiDiscussion.all
).Akhirnya, mengomentari konten
users.rb
memungkinkan saya untuk akhirnya berhasil memigrasi database saya.FYI: ada diskusi di sini
ActiveAdmin
tentang apakah permata itu harus memuat database saat diperlukan.sumber
Jadi mengalami masalah yang sama sekarang. Ingatlah untuk hanya memiliki satu model di setiap migrasi. Itu menyelesaikannya untuk saya.
Saya menemukan jawabannya di sini.
sumber
Saya menangkap Error:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "users" does not exist LINE 8: WHERE a.attrelid = '"users"'::regclass
Ternyata itu adalah perbaikan yang sangat mudah. Saya telah menyalin file dari versi lama proyek dan lupa menaruhnya di dalam folder "migrasi". Ketika saya melakukannya, itu memecahkan masalah saya.
sumber
ini biasanya dapat terjadi jika Anda menggunakan jenis pengaitan yang salah antar model, periksa penghancuran ketergantungan dan asosiasi memiliki_many, misalnya:
cara yang salah yang dapat menyebabkan masalah ini:
article.rb
has_many :subcategories, through: :categories, dependent: :destroy
subcategory.rb
has_and_belongs_to_many :articles
cara yang benar:
article.rb
has_many :subcategories, through: :categories, dependent: :destroy
subcategory.rb
declare association with categories here not articles (belongs_to / has_many_and_belongs_to)
sumber
Melupakan file migrasi dalam komit Anda dapat menyebabkan masalah ini. Ketika didorong pada heroku untuk mis
rails db:migrate
jelas tidak akan berfungsi. Pastikan bahwa file migrasi yang mendefinisikan tabel yang tidak ditentukan telah dilakukan.sumber