PG tanımlanamayan hata ilişkisi kullanıcıları mevcut değil


94

Bu soruyu daha önce görmüştüm, ama sadece rspec için. Henüz test oluşturmadım çünkü benim için çok ileri ama bir gün yakında yapacağım! : P

Uygulamama kaydolmaya / giriş yapmaya çalıştığımda bu hatayı alıyorum. Kullanıcı oluşturmak için devise kullandım ve ayrıca google ile oturum açmak için omniauth2 kullandım .

bu hata

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

Denedim rake db:migrate, ancak zaten oluşturuldu: şema tablosunda kullanıcılar var. Bu hatayı daha önce alan var mı?

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:

Herhangi bir cevap yardımcı oldu mu?
Малъ Скрылевъ

Benim için değil, aynı hatayı yapmak ve cevapların hiçbiri yardımcı olmadı.
Gustavo Semião-Lobo

@GustavoLobo uygun bir göçmenlik ayarladınız mı?
Малъ Скрылевъ

8
Aslında yanılmışım, bunun için üzgünüm. RAILS_ENV=test rake db:migratebenim için çalıştı.
Gustavo Semião-Lobo

Yanıtlar:


120

İlk olarak, tüm bağlantıları veritabanından çıkarmanız gerekir. Varsayılan olarak geliştirme ortamını kullanırsınız. Ardından aşağıdakilerle veritabanını sıfırlamayı deneyin:

rake db:reset

Rake db: reset görevi veritabanını bırakacak ve yeniden kuracaktır. Bu, işlevsel olarak db: drop db: setup komisyonuna eşdeğerdir.

Bu, tüm geçişleri çalıştırmakla aynı şey değildir. Yalnızca geçerli schema.rb dosyasının içeriğini kullanacaktır. Bir geçiş geri alınamıyorsa, rake db: reset size yardımcı olmayabilir. Şema dökümü hakkında daha fazla bilgi edinmek için Şema Dampingi ve Siz bölümüne bakın. Rails Belgeleri

Hile yardımcı olmazsa, veritabanını bırakın, ardından yeniden oluşturun, verileri taşıyın ve tohumlarınız varsa veritabanını ekin:

rake db:drop db:create db:migrate db:seed

veya kısaca (3.2'den beri):

rake db:migrate:reset db:seed

Yana db:migrate:resetdüşüşüne sebep olur oluşturmak ve db göç ederler. Varsayılan ortam geliştirme olduğundan , rakeözellik testlerinde istisnayı görürseniz, test ortamı için aşağıdaki gibi db'yi yeniden oluşturmanız gerekir :

RAILS_ENV=test rake db:drop db:create db:migrate

veya sadece taşınan şemayı yükleyerek:

RAILS_ENV=test rake db:drop db:create db:schema:load

Çoğu durumda, test veritabanı test prosedürleri sırasında ekilir, bu nedenle db:seedgörev eyleminin geçilmesi gerekmez. Aksi takdirde, veritabanını hazırlamanız gerekir (bu, Rails 4'te kaldırılmıştır ):

rake db:test:prepare

ve sonra (gerçekten gerekliyse):

RAILS_ENV=test rake db:seed

Rails'in daha yeni sürümlerinde ActiveRecord :: NoEnvironmentInSchemaError hatası yükselebilir, bu nedenle görevleri bir veritabanı ortamı seti task: db: environment: set :

RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate

benim için - RAILS_ENV = test rake db: drop db: create db: schema: yük çalışıyor, yanıt için teşekkürler. Harika
AMIC MING

1
rake db:test:prepareişi yapar.
Francisco Quintero

Teşekkür ederim bay, hayatımı kurtardın. Bırakmaya, oluşturmaya, taşımaya, kurmaya çalışıyorum ama size komut verene kadar bu komutlardan hiçbiri çalışmıyor rake db:reset. Sihir olur adamım!
Travis Le

19

Bu hatayla karşılaştım ve araştırmam üzerine, PG tanımlanamayan hata ilişkisinin nedenlerinden birinin kullanıcıların hatası olmadığını öğrendim :

Bu hata bir taşıma hatasıdır. Bazı veritabanı özniteliklerine sahip yeni model oluşturmuş olabilirsiniz. Modeli oluşturduktan sonra, öznitelikleri rails uygulama şemanıza taşımanız gerekir.

Yerel makine kullanıyorsanız, geliştirme için komut kullanabilirsiniz

rake db:migrate

Heroku kullanıyorsanız

heroku run rake db:migrate

3
Mükemmel! Raylar 5 için 'heroku run rails db: migrate' kullanmalısınız
Raphael Onofre

1
Bu benim için çalıştı. Koşmam gerekiyordu rake db:migrate. Teşekkürler.
Promise Preston

15

Test veritabanınız rspec için hazır değil.

Bu hatayı düzeltmek için test veritabanınızı rspec için hazırlayın

RAILS_ENV=test rake test:prepare

Bırakacak, oluşturacak ve test veritabanınıza geçişler ekleyecektir

Komisyon görevinin 'PG :: Hata: HATA: veritabanı "[your_db_test]" gibi bir mesajla iptal edilmesi durumunda, diğer kullanıcılar tarafından bu görevi gerçekleştirin

RAILS_ENV=test rake db:migrate

13

Benzer bir hatam vardı. Hatamın kökeni, factories.rb dosyamda bir Rails modeline referans olmasıydı. Bu yüzden bir yük hatası sorununa neden oldu. Düzeltme, referansı bir bloğa kaydırmak veya {}onu çalıştırmayı geciktirmek oldu.

KIRIK kod şuydu:

FactoryGirl.define do
  factory :user do
    guid User.new.send(:new_token)
  end
end

UserFabrikalar.rb yüklenirken tanımlanmadığı için hata veriyordu . Ben sarılmış User.newbir bloğunda çağrı ve yazılım sorunu çözüldü:

Sabit kod:

FactoryGirl.define do
  factory :user do
    guid { User.new.send(:new_token) }
  end
end

Not: Modelinizi bu şekilde çağırmanız muhtemelen en iyi uygulama değildir, ancak kodumu KURUTMAK için bir çözümdü.


Biri lütfen neden "muhtemelen modelinizi aramanız gereken en iyi uygulama olmadığını" açıklayabilir mi? KURU faydalarına katılıyorum ... sakıncaları nelerdir? Teşekkürler!
theUtherSide

11

Rspec çalıştırırken de bu hatayı alıyordum:

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

Koştuktan sonra benim için çözüldü

rake db:test:prepare
rake db:test:load

11

Bu genellikle ActiveAdmin'deki bir hatadan kaynaklanır. Hatayı nasıl aşacağınız aşağıda açıklanmıştır:

ActiveAdmin kullanıyorsanız, PG tablonun mevcut olmadığını söylüyorsa, o ActiveAdmin rb dosyasının içeriğini yorumlayın.

Örneğin, bu durumda PGError: ERROR: relation "users" does not exist, tüm içeriğini yorumlayın app/admin/users.rbve taşıma işlemlerinizi yaptıktan sonra açıklamayı kaldırın.


Sadece bu benim için çalıştı. Hayatımı kurtardın kardeşim! Teşekkürler
micper

5

Benim için bu sorun Factory Girl raylarından kaynaklanıyordu. Kullananlar için specs / fabrika klasörünü specs / temp olarak yeniden adlandırmasını ve denemesini tavsiye ederim

RAILS_ENV = your_environment bundle exec rake db: migrate --trace

Geçerse, ona neyin sebep olduğunu buldunuz. Factory Girl Rails mücevher github deposunda hızlı bir araştırma sorunu tanımlamama yardımcı oldu.

Fabrikalar başarısız oluyordu çünkü ben çalıştırıldığında var olmayan bir Modeli somutlaştırmaya çalışıyordum! Aşağıdaki kod örneği:

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

Diziyi bir blok içinde kapsüllemek ({} eklemek) benim için düzeltmeyi yaptı. Ödeme_seçeneklerinin örnekte birden fazla ödeme seçeneği alabileceğini unutmayın ...

payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}

Daha fazla bilgi için Factory Girl Rails belgelerinin Dinamik Özellikler bölümüne bakın .

Fabrikalar klasörünüzü yeniden adlandırmayı unutmayın!


4

Aynı sorunla karşı karşıyaydım ve sonra aşağıdaki çözümü keşfettim.

Aşağıdaki tüm kimlik bilgilerini database.yml dosyasına girdiğinizden ve bunların doğru olduğundan emin olun:

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 

3

Kullanıcılar tablosunu sildikten sonra bu sorunu yaşadım. çözümler değişiyordu

change_table(:users)

-e

create_table(:users)

3

::Migration[5.0]göçlerde eksikti. sözdizimi hatası atmak yerine atar

PG :: TanımsızTable: HATA: ilişki rolleri mevcut değil

saatler harcadıktan sonra nihayet göçün eksik olduğunu anladım ::Migration[5.0].

Hatalı Göç:

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

Sabit ve Doğru Geçiş

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

Bu, raylarla ilgili bir hata olabilir ve mücadele etmek ve merak etmek yerine birine yardımcı olabilir.


Evet!!! Raylar 5 için yaygın bir sorun olsa da bunun bir hata olduğunu düşünmüyorum. Rayların bunu doğrudan ActiveRecord'dan devralarak
Topluluk

2

Rspec kullanarak testleri çalıştırmaya çalışırken benzer bir hata alıyordum.

Малъ Скрылевъ'nın adımlarını takip ettim ama yine de kısa kaldım. Yapmam gereken son adım, şemamı şunu kullanarak test veritabanıma yüklemekti:

RAILS_ENV=test rake db:schema:load

Bundan sonra sorun ortadan kalktı ve bir sonraki hataya geçebilirim. Umarım bu size biraz fikir verir.



2

(Bunun eski olduğunu biliyorum, ancak gelecekteki Google çalışanları için)

Kullandığınız devise? Özellikle omniauthablebir sorun olduğunu biliyorum , ama belki başkaları da. Gerçi olmak zorunda değil devise. Genel olarak çözüm, sorun teşkil eden modeli, sınıfı, her neyse, yorumlamak ve hataların istediği herhangi bir bölümün açıklamasını kaldırmaktır.

Benim için olan şey, argüman olarak neye sahip olduğunuzu görmek deviseiçin Usermodeli okumaktır devise(sınıf metodu yani devise :database_authenticatable, :registerable #etc)

Ancak, tüm dosyayı okuyacaktır ve eğer bu yeni bir proje değilse, başka şeylere dayanan diğer sınıf yöntemleri tarafından tetiklenebilir (benim durumumda bu friendly_idmücevherdi ve sonra biralias_method

Cevap, satır (lar) * Userharicinde modeli yorumlamaktı deviseve rake db:schema:loaddüzgün çalışmalıdır.

  • aksi halde şu hatayı aldım:

    ArgumentError: omniauthable olmayan bir kaynakta Haritalama omniauth_callbacks ekleyiniz devise :omniauthableiçin Usermodele


2

Taşıma sırasında bu hatayı alırsanız model adınızın çoğul olduğundan emin olun

Örneğin.

add_column :images, :url, :string

1

En olası neden, komisyonunuzun web sunucunuzdan database.yml'den farklı bir ortam kullanmasıdır.


Merhaba, bu nasıl emin olabileceğim bir şey? Terminale koyabileceğim komut var mı?
Naomi K

ve web sunucunuzu nasıl başlatıyorsunuz?
techvineet

Şu anda terminalde rayları kullanarak yerel olarak koşuyorum
Naomi K,

1

Bu sorunu yaşadım ve Grape API'den kaynaklandığı ortaya çıktı . Yığın izlemede, geçiş sırasında yol dosyasının okunduğunu fark ettim.

Route.rb'de Üzüm api monte edilir

mount API::Base => '/'

Ve API'de eksik modele referanslar vardı. Bu yüzden, bu cevap sayesinde , sunucu tarafından mı yoksa taşıma sırasında mı çalıştırıldığını algılayan bir bloğa koydum.

unless ( File.basename($0) == "rake" && ARGV.include?("db:migrate") )
    mount API::Base => '/'
end

Ve işe yaradı.


1

Aşağıdaki hatayı type_zonesalıyordum ve bulamadığım için tüm uygulama koduma bir arama yapıyordum . Ayrıca db'ye baktım ve güncellendi.

/test/fixtures/type_zones.ymlSoruna neden olan şey fikstürlerin altındaki bir dosyaymış .

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"

1

Hala bu sorunu yaşayan herkes için, benim durumumda, bu hatayı tetikleyen FactoryGirl'deki fabrikamdı.

".New" veya ".create" aracılığıyla referans eklemeye çalışıyordum.


0

Benim durumumda, 2 ActiveAdmin dosyaya yorum yapmak zorunda kaldım . İşte adımlarım:

  1. İlk hata / yığın izleme ( Solrbu projede kullandığımıza dikkat edin ): ⇒ 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)

Yukarıdaki Arcolye'nin cevabına göreapp/admin/discussions.rb dosyayı yorumladım ve veritabanımı yeniden taşımayı denedim.

Aynı hata.

Yığın izine biraz daha yakından baktım ve aslında app/admin/users.rb:25istisnayı attığını fark ettim - ve kesinlikle, bu dosyanın masama bağımlılığı var discussions(yürütme yoluyla Discussion.all).

Son olarak, içeriğini yorumlamak users.rb, nihayet veritabanımı başarıyla taşımama izin verdi.

Bilginize: Burada , ActiveAdminbu gem'in gerektiğinde veritabanını yüklemesi gerekip gerekmediğiyle ilgili bir tartışma var .



0

Hatayı yakalıyordum:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 8:                WHERE a.attrelid = '"users"'::regclass

Çok kolay bir düzeltme olduğu ortaya çıktı. Dosyaları projenin eski bir sürümünden kopyalamıştım ve onları bir "geçiş" klasörünün içine yerleştirmeyi unutmuştum. Bunu yaptığımda benim için sorunu çözdü.


0

genellikle modeller arasında yanlış ilişki türü kullandığınızda meydana gelebilir , bağımlılık yok etme ve has_many ilişkilendirmeleri için kontrol edin, örneğin:

bu soruna neden olabilecek yanlış yol:

article.rb

 has_many :subcategories, through: :categories, dependent: :destroy

subcategory.rb

has_and_belongs_to_many :articles

doğru yol:

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)

0

Kaydınızdaki taşıma dosyasını unutmanız bu soruna neden olabilir. Örneğin, heroku'ya basıldığında rails db:migratekesinlikle işe yaramayacaktır. Tanımsız tabloyu tanımlayan geçiş dosyasının kaydedildiğinden emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.