PG अपरिभाषित त्रुटि संबंध उपयोगकर्ता मौजूद नहीं हैं


92

मैंने इस सवाल को पहले देखा, लेकिन केवल rspec के लिए। मैंने अभी तक परीक्षण नहीं बनाया है क्योंकि यह मेरे लिए बहुत उन्नत है लेकिन एक दिन जल्द ही मैं करूँगा! : पी

मुझे यह त्रुटि तब मिलती है जब मैं अपने ऐप में साइन-अप / लॉगिन करने की कोशिश करता हूं। मैंने उपयोगकर्ता बनाने के लिए और Google के साथ साइन-इन करने के लिए omniauth2 का भी उपयोग किया ।

यह त्रुटि है

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

मैंने कोशिश की rake db:migrate, लेकिन यह पहले से ही बना है: स्कीमा तालिका में उपयोगकर्ता मौजूद हैं। किसी को भी इस त्रुटि से पहले है?

database.yml

config = / opt / स्थानीय / 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:

क्या कोई उत्तर मददगार रहा है?
Мал

मेरे लिए नहीं, एक ही त्रुटि होने और उत्तर में से कोई भी मददगार नहीं रहा।
बजे गुस्तावो सेमी-लोबो

@GustavoLobo आप एक उचित प्रवासन की स्थापना की है?
Мал

8
दरअसल, मैं गलत था, इसके लिए खेद है। RAILS_ENV=test rake db:migrateमेरे लिए काम किया।
गुस्तावो सेमी-लोबो

जवाबों:


118

सबसे पहले, आप डेटाबेस से सभी कनेक्शन अलग कर लेंगे। डिफ़ॉल्ट रूप से आप विकास पर्यावरण का उपयोग करते हैं। फिर निम्नलिखित के साथ डेटाबेस रीसेट करने का प्रयास करें:

rake db:reset

रेक डीबी: रीसेट कार्य डेटाबेस को छोड़ देगा और इसे फिर से सेट करेगा। यह कार्यात्मक रूप से रेक डीबी: ड्रॉप डीबी: सेटअप के बराबर है।

यह सभी पलायन चलाने के समान नहीं है। यह केवल वर्तमान स्कीमा.आरबी फ़ाइल की सामग्री का उपयोग करेगा। यदि माइग्रेशन को वापस नहीं लाया जा सकता है, तो रैक db: रीसेट आपकी मदद नहीं कर सकता है। स्कीमा डंप करने के बारे में अधिक जानने के लिए स्कीमा डंपिंग और यू सेक्शन देखें। रेल्स डॉक्स

यदि ट्रिक मदद नहीं करती है, तो डेटाबेस को छोड़ दें, फिर इसे फिर से बनाएं, डेटा माइग्रेट करें, और यदि आपके पास बीज हैं, तो डेटाबेस को बोएं:

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

या संक्षेप में (3.2 से):

rake db:migrate:reset db:seed

चूंकि db:migrate:resetडीबी का मतलब ड्रॉप करना, बनाना और माइग्रेट करना है। क्योंकि के लिए डिफ़ॉल्ट वातावरण rakeहै विकास , मामले में आप कल्पना परीक्षणों में अपवाद नहीं दिखाई देता तो आप चाहिए के लिए डाटाबेस फिर से बनाने परीक्षण वातावरण इस प्रकार है:

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

या बस माइग्रेटेड योजना को लोड करने के साथ:

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

ज्यादातर मामलों में परीक्षण प्रक्रियाओं के दौरान परीक्षण डेटाबेस को बोया जा रहा है, इसलिए db:seedकार्य कार्रवाई को पारित करने की आवश्यकता नहीं है। अन्यथा, आपको डेटाबेस तैयार करना होगा (यह रेल 4 में पदावनत है ):

rake db:test:prepare

और फिर (यदि यह वास्तव में आवश्यक है):

RAILS_ENV=test rake db:seed

रेल के नए संस्करणों में त्रुटि ActiveRecord :: NoEnvironmentInSchemaError को बढ़ाया जा सकता है, इसलिए बस डेटाबेस वातावरण सेट कार्य के साथ कार्यों को पूर्व निर्धारित करें: db: पर्यावरण: सेट :

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

मेरे लिए - RAILS_ENV = परीक्षण रेक db: ड्रॉप db: बनाएँ db: स्कीमा: लोड कार्य, उत्तर के लिए धन्यवाद। ग्रेट
एएमआईसी मिंग

rake db:test:prepareनौकरी करता है।
फ्रांसिस्को क्विंटो

शुक्रिया मिस्टर यू तुम मेरी जान बचाओ। मैं ड्रॉप करने, बनाने, माइग्रेट करने, सेटअप करने की कोशिश करता हूं, लेकिन उन कमांडों में से कोई भी काम नहीं करता है जब तक कि मैं आपको कमांड देने की कोशिश नहीं करता rake db:reset। जादू होता है यार!
ट्रैविस ले

18

मुझे इस त्रुटि का सामना करना पड़ा, और मेरे शोध पर, पता चला कि PG अपरिभाषित त्रुटि संबंध उपयोगकर्ताओं के लिए कारणों में से एक त्रुटि नहीं है:

यह त्रुटि एक माइग्रेशन त्रुटि है। आपने कुछ डेटाबेस विशेषताओं के साथ नया मॉडल बनाया हो सकता है। मॉडल बनाने के बाद आपको अपने रेल एप्लिकेशन स्कीमा में विशेषताओं को माइग्रेट करना होगा।

यदि आप स्थानीय मशीन का उपयोग कर रहे हैं, तो विकास के लिए, आप कमांड का उपयोग कर सकते हैं

rake db:migrate

यदि आप heroku का उपयोग कर रहे हैं

heroku run rake db:migrate

3
अति उत्कृष्ट! : रेल 5 के लिए आप का उपयोग करना चाहिए 'विस्थापित Heroku db रेल चलाने'
राफेल Onofre

1
इसने मेरे लिए काम किया। मुझे दौड़ने की जरूरत थी rake db:migrate। धन्यवाद।
प्रॉमिस

14

आपका परीक्षण डेटाबेस rspec के लिए तैयार नहीं है।

इस त्रुटि को ठीक करने के लिए rspec के लिए अपना परीक्षण डेटाबेस तैयार करें

RAILS_ENV=test rake test:prepare

यह आपके परीक्षण डेटाबेस में माइग्रेशन को गिराएगा, बनाएगा और जोड़ेगा

यदि रेक कार्य को 'पीजी :: त्रुटि: त्रुटि: डेटाबेस "[[your_db_test]" जैसे संदेश के साथ निरस्त किया जाता है, तो इसे अन्य उपयोगकर्ताओं द्वारा निष्पादित किया जा रहा है।

RAILS_ENV=test rake db:migrate

12

मेरी भी ऐसी ही त्रुटि थी। मेरी त्रुटि की जड़ यह थी कि मेरे कारखानों में एक रेल मॉडल का संदर्भ था। आरबी फाइल। तो यह एक लोड त्रुटि समस्या का कारण बना। फिक्स को संदर्भ को एक ब्लॉक में लपेटना था या {}ताकि इसे चलाने में देरी हो।

यहाँ BROKEN कोड था:

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

और यह गलत था क्योंकि Userजब कारखानों को लोड नहीं किया जा रहा था तब परिभाषित नहीं किया गया था। मैंने User.newकॉल को ब्लॉक में लपेट दिया और इसने समस्या हल कर दी:

निश्चित कोड:

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

नोट: शायद इस तरह से अपने मॉडल को कॉल करने की आवश्यकता के लिए सबसे अच्छा अभ्यास नहीं है, लेकिन यह मेरे कोड को DRY करने का एक समाधान था।


किसी को भी समझा सकते हैं कि यह "अपने मॉडल को कॉल करने की आवश्यकता के लिए सबसे अच्छा अभ्यास क्यों नहीं है"? मैं DRY लाभों से सहमत हूं ... क्या कमियां हैं? धन्यवाद!
TheUtherSide

11

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

मेरे दौड़ने के बाद इसका समाधान हो गया

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

11

यह अक्सर ActiveAdmin में एक बग के कारण होता है। यहां बग के बारे में बताया गया है:

यदि आप ActiveAdmin का उपयोग कर रहे हैं, तो जो भी तालिका PG कहती है, मौजूद नहीं है, उस ActiveAdmin आरबी फ़ाइल की सामग्री पर टिप्पणी करें।

उदाहरण के लिए, इस मामले के लिए, अपने माइग्रेशन किए जाने के बाद PGError: ERROR: relation "users" does not existकी संपूर्ण सामग्री पर टिप्पणी app/admin/users.rbकरें।


केवल इसने मेरे लिए काम किया। तुमने मेरी जान बचाई! धन्यवाद
micper

5

मेरे लिए वह मुद्दा फैक्ट्री गर्ल रेल की वजह से था। मैं इसका उपयोग करने वालों के लिए चश्मा / कारखानों फ़ोल्डर का नाम बदलकर चश्मा / अस्थायी और प्रयास करने के लिए सिफारिश करूंगा

RIDS_ENV = your_environment बंडल निष्पादन रेक db: माइग्रेट --trace

यदि यह गुजरता है, तो आपने अभी पाया कि यह क्या कारण था। फैक्ट्री गर्ल रेल रत्न गीथूब रेपो के माध्यम से एक त्वरित खुदाई ने मुझे इस मुद्दे की पहचान करने में मदद की।

कारखाने विफल हो रहे थे क्योंकि मैं एक मॉडल को तुरंत चलाने की कोशिश कर रहा था जो चलने पर मौजूद नहीं था! नीचे दिए गए कोड का नमूना:

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

एक ब्लॉक में ऐरे को एनकैप्सुलेट करके ({} जोड़कर) मेरे लिए ठीक किया। ध्यान दें कि भुगतान_ विकल्प उदाहरण में एक से अधिक भुगतान विकल्प ले सकते हैं ...

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

अधिक जानकारी के लिए फ़ैक्टरी गर्ल रेल डॉक्स के डायनेमिक एट्रीब्यूट्स पार्ट का संदर्भ लें ।

अपने कारखानों फ़ोल्डर का नाम बदलने के लिए मत भूलना!


4

मैं उसी समस्या का सामना कर रहा था और फिर मैंने निम्नलिखित समाधान खोजा।

सुनिश्चित करें कि आपने database.yml फ़ाइल में निम्नलिखित सभी क्रेडेंशियल्स दर्ज किए हैं और वे सही हैं:

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

उपयोगकर्ता तालिका को हटाने के बाद मुझे यह समस्या हुई। समाधान बदल रहा था

change_table(:users)

सेवा

create_table(:users)

3

::Migration[5.0]पलायन में गायब था। सिंटैक्स त्रुटि को फेंकने के बजाय यह फेंकता है

PG :: अपरिभाषित: ERROR: संबंध भूमिकाएँ मौजूद नहीं हैं

घंटों बर्बाद करने के बाद आखिरकार मुझे पता चला कि प्रवास गायब है ::Migration[5.0]

त्रुटिपूर्ण प्रवासन:

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

फिक्स्ड और सही माइग्रेशन

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

यह पटरियों के साथ एक बग हो सकता है और संघर्ष और आश्चर्य के बजाय किसी की मदद कर सकता है।


हाँ!!! मुझे नहीं लगता कि यह एक बग है, हालांकि यह रेल के लिए एक आम मुद्दा है। मुझे लगता है कि रेल ने जानबूझकर यह सीधे ActiveRecord से विरासत में
सामुदायिक

2

Rspec का उपयोग करके परीक्षण चलाने का प्रयास करते समय मुझे एक समान त्रुटि मिल रही थी।

मैंने Мал followed Скрылев steps के कदमों का पालन किया, लेकिन फिर भी संक्षिप्त रूप से समाप्त हुआ। अंतिम चरण जो मुझे करने की ज़रूरत थी, उसने अपने स्कीमा को मेरे परीक्षण डेटाबेस में लोड किया था:

RAILS_ENV=test rake db:schema:load

उसके बाद समस्या दूर हो गई और मैं अगले बग पर जा सका। उम्मीद है कि यह आपको कुछ जानकारी देता है।



2

(मुझे पता है कि यह पुराना है, लेकिन भविष्य के googlers के लिए)

क्या आप उपयोग कर रहे हैं devise? मुझे पता है कि विशेष रूप omniauthableसे एक समस्या है, लेकिन शायद दूसरों को भी। deviseहालांकि यह होना जरूरी नहीं है । आम तौर पर समाधान के लिए आक्रामक मॉडल, वर्ग, जो कुछ भी हो, और त्रुटियों के लिए पूछे जाने वाले किसी भी अनुभाग पर टिप्पणी नहीं करना है।

मेरे लिए, जो हो रहा था, वह deviseयह Userदेखने के लिए मॉडल पढ़ रहा है कि आपके पास क्या तर्क हैं devise(कक्षा पद्धति अर्थात devise :database_authenticatable, :registerable #etc)

लेकिन, यह पूरी फाइल को पढ़ेगा और यदि यह एक नई परियोजना नहीं है तो यह अन्य चीजों पर निर्भर अन्य वर्ग विधियों द्वारा उलझ सकता है (मेरे मामले में यह friendly_idमणि था , और फिर एकalias_method

इसका उत्तर यह था Userकि deviseलाइनों को छोड़कर मॉडल पर टिप्पणी करें * और rake db:schema:loadठीक चलना चाहिए।

  • अन्यथा मुझे यह त्रुटि मिली:

    ArgumentError: एक संसाधन है कि omniauthable नहीं है पर मानचित्रण omniauth_callbacks जोड़ें devise :omniauthableकरने के लिए Userमॉडल


2

यदि आपको माइग्रेट करते समय यह त्रुटि मिलती है, तो सुनिश्चित करें कि आपका मॉडल नाम बहुवचन है

उदा।

add_column :images, :url, :string

1

सबसे संभावित कारण यह है कि आपका रेक अपने वेबसर्वर की तुलना में डेटाबेस से अलग वातावरण का उपयोग कर रहा है।


हाय, यह कैसे मैं निश्चित हो सकता है? क्या मैं कमांड को टर्मिनल में रख सकता हूं?
नाओमी के

और आप अपना वेबसर्वर कैसे शुरू कर रहे हैं?
टेकविनीट

मैं अभी-अभी स्थानीय रूप से टर्मिनल में रेल का उपयोग कर रहा हूं
नाओमी के

1

मुझे यह समस्या थी और यह ग्रेप एपीआई के कारण हुआ । मैंने स्टैक ट्रेस में देखा कि प्रवास के दौरान मार्गों की फ़ाइल पढ़ी जा रही थी।

मार्गों में।आरबीपी ग्रेप एपि को आरोहित किया जाता है

mount API::Base => '/'

और एपीआई में लापता मॉडल के संदर्भ थे। तो, इस जवाब के लिए धन्यवाद मैंने इसे एक ब्लॉक में रखा है जो पता लगाता है कि क्या यह सर्वर द्वारा चलाया जा रहा है या प्रवास के दौरान।

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

और इसने काम किया।


1

मुझे निम्नलिखित त्रुटि हो रही थी और मेरे सभी एप्लिकेशन कोड में लुकअप करने के लिए type_zonesमैं इसे ढूंढ नहीं पा रहा था। मैंने db को भी देखा और इसे अपडेट किया गया।

पता चला कि यह जुड़नार के तहत एक फाइल /test/fixtures/type_zones.ymlथी जो परेशानी पैदा कर रही थी।

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

किसी को भी जो अभी भी इस समस्या के लिए है, मेरे मामले में, यह FactoryGirl में मेरा कारखाना था जो इस त्रुटि को ट्रिगर कर रहा था।

मैं '.new' या '.create' के माध्यम से संदर्भ जोड़ने की कोशिश कर रहा था।


0

मेरे मामले में, मुझे 2 ActiveAdmin फाइलों पर टिप्पणी करनी थी । यहाँ मेरे कदम थे:

  1. प्रारंभिक त्रुटि / स्टैकट्रेस ( Solrइस परियोजना पर हम जो प्रयोग कर रहे हैं ): ⇒ 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)

मैंने ऊपर आर्कोलाई के उत्तर केapp/admin/discussions.rb अनुसार फ़ाइल को टिप्पणी की और अपने डेटाबेस को फिर से स्थानांतरित करने का प्रयास किया।

वही त्रुटि।

मैंने स्टैकट्रेस को थोड़ा और करीब से देखा, और देखा कि वास्तव app/admin/users.rb:25में अपवाद को फेंक रहा था - और निश्चित रूप से पर्याप्त है, उस फ़ाइल की मेरी discussionsतालिका (निष्पादन के माध्यम से Discussion.all) पर निर्भरता है ।

अंत में, users.rbमुझे अंतिम रूप से अपने डेटाबेस को सफलतापूर्वक स्थानांतरित करने की अनुमति दी गई सामग्री पर टिप्पणी करना ।

जानकारी के लिए: वहाँ एक चर्चा है यहाँ में ActiveAdminके बारे में है कि क्या है कि मणि डेटाबेस जरूरत पड़ने पर लोड करना चाहिए।



0

मैं त्रुटि पकड़ रहा था:

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

यह एक सुपर आसान फिक्स निकला। मैंने प्रोजेक्ट के पुराने संस्करण से फ़ाइलों की प्रतिलिपि बनाई थी और "माइग्रेट" फ़ोल्डर के अंदर उन्हें घोंसला बनाना भूल गया था। जब मैंने ऐसा किया तो मेरे लिए यह समस्या हल हो गई।


0

यह आमतौर पर तब हो सकता है जब आप मॉडल के बीच गलत प्रकार के जुड़ाव का उपयोग करते हैं , उदाहरण के लिए निर्भरता को नष्ट करने और has_many संघों की जाँच करें:

गलत तरीका जो इस परेशानी का कारण बन सकता है:

article.rb

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

subcategory.rb

has_and_belongs_to_many :articles

सही रास्ता:

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