2011-01-14 29 views
8

मुझे Django 1.2.4 के साथ कोई समस्या है।Django: डेटाबेस एरर कॉलम मौजूद नहीं है

यहाँ एक मॉडल है:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from apps.foo.models import Foo 
>>> Foo.objects.all() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 67, in __repr__ 
    data = list(self[:REPR_OUTPUT_SIZE + 1]) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 82, in __len__ 
    self._result_cache.extend(list(self._iter)) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 271, in iterator 
    for row in compiler.results_iter(): 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 677, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 732, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/backends/util.py", line 15, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute 
    return self.cursor.execute(query, args) 
DatabaseError: column foo_foo.bar_id does not exist 
LINE 1: ...t_omg", "foo_foo"."ftw", "foo_foo... 

क्या मैं गलत कर रहा हूँ यहाँ:

class Foo(models.Model): 
    # ... 
    ftw = models.CharField(blank=True) 
    bar = models.ForeignKey(Bar, blank=True) 

सही डेटाबेस निस्तब्धता के बाद, मैं खोल का उपयोग करें?

अद्यतन: यदि मैं ForeignKey पर टिप्पणी करता हूं, तो समस्या गायब हो जाती है।

अद्यतन 2: मजे की बात है, इस इकाई परीक्षण बस ठीक काम करता है:

def test_foo(self): 
    f = Foo() 
    f.save() 

    self.assertTrue(f in Foo.objects.all()) 

क्यों इसे यहाँ लेकिन खोल में नहीं काम करता है?

अद्यतन 3: कारण यह इकाई परीक्षण में काम करता है, लेकिन नहीं खोल विभिन्न डेटाबेस के साथ कुछ हो सकता है इस्तेमाल किया जा रहा:

settings.py:

DATABASES = { 
    'default': { 
     'ENGINE': 'postgresql_psycopg2', 
     'NAME': 'foo', 
     'USER': 'bar', 
     'PASSWORD': 'baz', 
     'HOST': '', 
     'PORT': '', 
    } 
} 

import sys 
if 'test' in sys.argv or True: 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3', 
      'NAME': 'testdb' 
     } 
    } 

अपडेट करें: पुष्टि की गई है कि जब मैं SQLite3 को डीबी के रूप में उपयोग करता हूं, तो सब कुछ ठीक काम करता है।

+1

स्पष्ट होने के लिए, आपने खाली डेटाबेस पर 'syncdb' चलाया है, या स्कीमा को हाथ से संपादित किया है? ऐसा लगता है कि आप जानते हैं कि एक संशोधित मॉडल स्वचालित रूप से तालिका को अपडेट नहीं करेगा ... लेकिन बस सुनिश्चित करें कि – Robert

+0

हाँ, मैं 'syncdb' चला गया। –

+0

मैं सिर्फ 100% सुनिश्चित करना चाहता हूं कि यह मौजूदा डेटाबेस समस्या नहीं है: क्या आपने अपना पोस्टग्रेज़ डेटाबेस गिरा दिया है और इसे फिर से बनाया है? जब लोग 'फ्लश' या आंशिक सिंकडब्स का प्रयास करते हैं तो मैंने निश्चित रूप से मुद्दों को देखा है। कारण मैं पूछता हूं क्योंकि अगर एक साधारण 2 फ़ील्ड मॉडल ने postgresql_psycopg2 पर स्तंभों को सही तरीके से नहीं बनाया है तो यह एक बदबू आ जाएगा। साथ ही, क्या आपने जांच की है कि 'doohell' में 'foo_foo.bar_id' मौजूद है या नहीं? अधिक जानकारी मर्फी! –

उत्तर

9

syncdb चलाने से पहले डेटाबेस को पूरी तरह से छोड़ने/पोंछने का प्रयास करें।

मुझे कुछ समय पहले ऐसा करने की ज़रूरत है जब मैंने विदेशी कुंजी क्षेत्रों में परिवर्तन किए थे।

+5

यह django दस्तावेज में निर्दिष्ट है कि syncdb मौजूदा तालिकाओं को संशोधित नहीं करेगा। तो यदि आपने syncdb के साथ तालिकाओं को बनाया है, और फिर मॉडल को बदलकर कुछ फ़ील्ड संशोधित किए हैं, तो आपको सब कुछ छोड़ना होगा: './manage.py रीसेट myapp' चाल करेगा। यह स्पष्ट रूप से अवांछित के लिए काम करता है क्योंकि प्रत्येक रन में तालिकाओं को फिर से बनाया जाता है। –

+1

यदि आप प्रत्येक मॉडल परिवर्तन के बाद अपना डीबी रीसेट नहीं करना चाहते हैं, तो [दक्षिण] (http://south.aeracode.org/) आज़माएं। – Bjorn

0

मुझे एक ही समस्या का सामना करना पड़ा और ध्यान दिया कि बैकएंड डेटाबेस में जो क्षेत्र विदेशी कुंजी रखता है वह अस्तित्व में नहीं था। क्षेत्र बनाने के बाद समस्या गायब हो गई (जो मुझे लगता है कि अनोखा है)। Django विदेशी कुंजी के रूप में लेबल क्षेत्र बनाने के लिए प्रतीत नहीं होता है। कोई कारण क्यों?

3

मैंने इस समस्या को उस मॉडल के प्रश्न के विशिष्ट मॉडल को छोड़कर तय किया। तब प्रयोग किया है:

python manage.py syncdb 

आप PostgreSQL का उपयोग करते हैं तो मैं अपनी एक वेब इंटरफेस phpMyAdmin कि MySQL के लिए प्रयोग किया जाता है के लिए इसी तरह phpPgAdmin का उपयोग करें। यूजर इंटरफेस के लिए

वैकल्पिक तुम सिर्फ कमांड लाइन कर सकते हैं

su postgres #change user to postgres 
psql <datebase> #access shell for <datebase> database 
\d #list all tables 
DROP TABLE "" CASCADE #select a table to drop 
\q #exit shell 

जब \ घ में, क्ष दबाकर बाहर निकल।

3

यदि आप Django 1.8 का उपयोग कर रहे हैं तो आपको कॉलम बनाना चाहिए। आप सही तरीके से स्तंभ बनाने जिसमें आप क्षेत्र बनाया प्रवास फ़ाइल खोजने के लिए और चलाने सुनिश्चित करने के लिए:

./manage.py sqlmigrate app_name migration_name_sans_extension 

हो जाएगा ताकि उत्पादन एसक्यूएल स्तंभ बनाने का आदेश देता है। रिश्तों को संभालने वाले आदेशों को शामिल करना सुनिश्चित करें और अपने डेटाबेस कंसोल में कमांड चलाएं। आपने टेबल या डेटाबेस को छोड़ने जैसे कुछ भी चरम करना है।

+0

क्या आप कह सकते हैं कि कॉलम कैसा दिखना चाहिए? उदाहरण के लिए, मेरे पास दो विदेशी कुंजी कॉलम हैं: refer_by और support_by जो दोनों उपयोगकर्ताओं को संदर्भित करते हैं। मैं फिर दो और कॉलम जोड़ूंगा: user_referred_by और user_supported_by और वे उपयोगकर्ता (आईडी) संदर्भित करेंगे ?? क्या आप कह सकते हैं कि 1.8 दस्तावेज़ों में यह कहां कवर किया गया है? – highpost

+1

उदाहरण के लिए, मैं अभी भी django.db.utils.ProgrammingError प्राप्त कर रहा हूं: कॉलम user.referred_by_id मौजूद नहीं है। – highpost

+0

कॉलम आईडी द्वारा संदर्भित करेंगे जबतक कि आप एक to_field फ़ील्ड निर्दिष्ट नहीं करते हैं। मुझे यकीन नहीं है कि यह दस्तावेज़ों में शामिल है लेकिन एफके फ़ील्ड की जानकारी यहां है: https://docs.djangoproject.com/en/1.8/ref/models/fields/#foreignkey –

3

इस कृपया पढ़ें से पहले आप अपने पूरे डीबी

मैं एक ही मुद्दा था छोड़ देते हैं। कृपया पूरी तरह से अपवाद पढ़ें। मेरे पास एक मॉडलफॉर्म क्लास था जो मेरी तालिका से एक फॉर्म बनाने और अपवाद बनाने के लिए पढ़ा गया था। मैंने टिप्पणी की और फिर makemigrations चलाने और पूरी तरह से काम करता है। इसके बाद मैंने मॉडलफॉर्म क्लास पर टिप्पणी की और सबकुछ सही काम कर रहा है।

उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे