Pengguna relasi error PG yang tidak ditentukan tidak ada

93

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:
Naomi K
sumber
Apakah ada jawaban yang membantu?
Малъ Скрылевъ
Bukan untuk saya, mengalami kesalahan yang sama dan tidak ada jawaban yang membantu.
Gustavo Semião-Lobo
@GustavoLobo sudahkah Anda mengatur migrasi yang tepat?
Малъ Скрылевъ
8
Sebenarnya saya salah, maaf untuk itu. RAILS_ENV=test rake db:migratebekerja untuk saya.
Gustavo Semião-Lobo

Jawaban:

119

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

Tugas rake db: reset akan menjatuhkan database dan mengaturnya kembali. Ini secara fungsional setara dengan rake db: drop db: setup.

Ini tidak sama dengan menjalankan semua migrasi. Ini hanya akan menggunakan konten file schema.rb saat ini. Jika migrasi tidak dapat dibatalkan, rake db: reset mungkin tidak membantu Anda. Untuk mengetahui lebih lanjut tentang membuang skema, lihat bagian Skema Dumping dan Anda. Rails Docs

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:resetmenyiratkan drop, buat dan migrasikan db. Karena lingkungan default untuk rakeadalah 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:seedtindakan 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
bagi saya - RAILS_ENV = uji rake db: drop db: buat db: skema: beban berfungsi, terima kasih atas jawabannya. Hebat
AMIC MING
rake db:test:preparemelakukan pekerjaan itu.
Francisco Quintero
Terima kasih Pak, Anda menyelamatkan hidup saya. Saya mencoba untuk menjatuhkan, membuat, bermigrasi, mengatur tetapi tidak ada dari perintah itu yang berfungsi sampai saya mencoba perintah Anda rake db:reset. Keajaiban terjadi man!
Travis Le
19

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
supritshah1289
sumber
3
Luar biasa! Untuk rel 5 Anda harus menggunakan 'heroku run rails db: migrate'
Raphael Onofre
1
Ini berhasil untuk saya. Saya harus lari rake db:migrate. Terima kasih.
Janji Preston
14

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
Serge Seletskyy
sumber
12

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 Usertidak ditentukan saat factory.rb sedang dimuat. Saya membungkus User.newpanggilan 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.

ehc
sumber
Adakah yang bisa menjelaskan mengapa "mungkin bukan praktik terbaik untuk perlu memanggil model Anda"? Saya setuju dengan manfaat KERING ... apa saja kekurangannya? Terima kasih!
theUtherSide
11

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
cedricdlb
sumber
11

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 konten app/admin/users.rb, kemudian hapus komentar setelah Anda melakukan migrasi.

Arcolye
sumber
Hanya ini yang berhasil untuk saya. Anda menyelamatkan hidup saya bro! Terima kasih
micper
5

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!

Igi Manaloto
sumber
4

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 
Muhammad Zubair
sumber
3

Saya mengalami masalah ini setelah saya menghapus tabel pengguna. solusi berubah

change_table(:users)

untuk

create_table(:users)
KnuturO
sumber
3

::Migration[5.0]hilang dalam migrasi. bukannya melemparkan kesalahan sintaks melempar

PG :: UndefinedTable: ERROR: peran relasi tidak ada

setelah 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.

Kaleem Ullah
sumber
Iya!!! Saya tidak berpikir itu bug meskipun ini adalah masalah umum untuk rails 5. Saya pikir rails sengaja melakukan ini secara langsung mewarisi dari ActiveRecord.
Komunitas
2

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.

Stephen
sumber
2

Hapus folder Admin dan jalankan rake lagi.

Roberto Capelo
sumber
2

(Saya tahu ini sudah tua, tetapi untuk calon karyawan Google)

Apakah Anda menggunakan devise? Saya tahu secara spesifik omniauthablesebuah masalah, tapi mungkin juga masalah lain. Tidak harus seperti itu devise. 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 devisemembaca Usermodel untuk melihat apa yang Anda miliki sebagai argumen untuk devise(metode kelas yaitu devise :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_idpermata, dan kemudianalias_method

Jawabannya adalah mengomentari Usermodel kecuali untuk devisebaris * dan rake db:schema:loadakan berfungsi dengan baik.

  • jika tidak, saya mendapat kesalahan ini:

    ArgumentError: Memetakan omniauth_callbacks pada sumber daya yang bukan omniauthable Harap tambahkan devise :omniauthableke Usermodel

MCB
sumber
2

Jika Anda mendapatkan kesalahan ini saat bermigrasi, pastikan nama model Anda jamak

misalnya.

add_column :images, :url, :string
stevec
sumber
1

Penyebab yang paling mungkin adalah rake Anda menggunakan lingkungan yang berbeda dari database.yml daripada server web Anda.

techvineet.dll
sumber
Hai, bagaimana ini sesuatu yang bisa saya yakini? apakah ada perintah yang bisa saya masukkan ke terminal?
Naomi K
dan bagaimana Anda memulai server web Anda?
techvineet
Saya hanya menjalankan secara lokal sekarang menggunakan rel di terminal
Naomi K
1

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.

Julian Mann
sumber
1

Saya mengalami kesalahan berikut dan melakukan pencarian ke semua kode aplikasi saya karena type_zonessaya tidak dapat menemukannya. Saya juga melihat db dan itu diperbarui.

Ternyata itu adalah file di bawah perlengkapan /test/fixtures/type_zones.ymlyang 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"
juliangonzalez
sumber
1

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'.

Mateus Luiz
sumber
0

Dalam kasus saya, saya harus mengomentari 2 ActiveAdmin file. Inilah langkah saya:

  1. Kesalahan awal / stacktrace (perhatikan yang kami gunakan Solrpada 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:in block 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.rbfile 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:25sedang melemparkan pengecualian - dan tentu saja, file itu memiliki ketergantungan pada discussionstabel saya (melalui mengeksekusiDiscussion.all ).

Akhirnya, mengomentari konten users.rbmemungkinkan saya untuk akhirnya berhasil memigrasi database saya.

FYI: ada diskusi di siniActiveAdmin tentang apakah permata itu harus memuat database saat diperlukan.

mecampbellsoup.dll
sumber
0

Jadi mengalami masalah yang sama sekarang. Ingatlah untuk hanya memiliki satu model di setiap migrasi. Itu menyelesaikannya untuk saya.

Saya menemukan jawabannya di sini.

Rex
sumber
0

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.

John Chriest
sumber
0

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)
milaziggy
sumber
0

Melupakan file migrasi dalam komit Anda dapat menyebabkan masalah ini. Ketika didorong pada heroku untuk mis rails db:migratejelas tidak akan berfungsi. Pastikan bahwa file migrasi yang mendefinisikan tabel yang tidak ditentukan telah dilakukan.

Paul Volet
sumber