2012-06-28 73 views
2

我有一個現有的數據庫,其中包含5列和大量數據的特定表。 (我今年進口從CSV)錯誤1054,「字段列表中的未知列'student_info.id'」 - Django

如果我執行在MySQL DESCRIBE student_info,它表明:

+--------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+--------+-------------+------+-----+---------+-------+ 
| pic_id | int(11)  | YES |  | NULL |  | 
| name | varchar(50) | YES |  | NULL |  | 
| hostel | varchar(3) | YES |  | NULL |  | 
| room | int(11)  | YES |  | NULL |  | 
| branch | varchar(4) | YES |  | NULL |  | 
| id_no | varchar(12) | YES |  | NULL |  | 
+--------+-------------+------+-----+---------+-------+ 

此表中的所有數據,因爲我已經通過各種SELECT語句,並通過工作臺

測試

在settings.py中,我配置了我的項目以成功連接到該數據庫。 然後,我給了命令

python manage.py inspectdb > studentinfo/models.py 

而且models.py的內容變成了:

class StudentInfo(models.Model): 
    pic_id = models.IntegerField(null=True, blank=True) 
    name = models.CharField(max_length=150, blank=True) 
    hostel = models.CharField(max_length=9, blank=True) 
    room = models.IntegerField(null=True, blank=True) 
    branch = models.CharField(max_length=12, blank=True) 
    id_no = models.CharField(max_length=36, blank=True) 
    class Meta: 
     db_table = u'student_info' 

然後,如果我執行syncdb後執行此:

python manage.py sqlall studentinfo 
    BEGIN; 
    CREATE TABLE `student_info` (
     `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 
     `pic_id` integer, 
     `name` varchar(150) NOT NULL, 
     `hostel` varchar(9) NOT NULL, 
     `room` integer, 
     `branch` varchar(12) NOT NULL, 
     `id_no` varchar(36) NOT NULL 
    ) 
    ; 
    COMMIT; 

所以一切似乎除了我收到這個錯誤,如果我試圖檢索任何東西:

>>> from studentinfo.models import StudentInfo 
>>> list=StudentInfo.objects.all() 
>>> list 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 69, in __repr__ 
    data = list(self[:REPR_OUTPUT_SIZE + 1]) 
    File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 84, in __len__ 
    self._result_cache.extend(self._iter) 
    File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 273, in iterator 
    for row in compiler.results_iter(): 
    File "/usr/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 680, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/usr/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 735, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/lib/python2.7/dist-packages/django/db/backends/util.py", line 34, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/lib/python2.7/dist-packages/django/db/backends/mysql/base.py", line 86, in execute 
    return self.cursor.execute(query, args) 
    File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
**OperationalError: (1054, "Unknown column 'student_info.id' in 'field list'")** 

任何想法可能會導致這種情況?

+0

ALTER TABLE'student_info' ADD'id' integer AUTO_INCREMENT NOT NULL PRIMARY KEY – Tisho

回答

7

sqlall只顯示如果您運行帶有空數據庫的syncdb會創建什麼。從你的DESCRIBE明顯看出,沒有id字段 - 事實上沒有主鍵,這是一個非常奇怪的設計。您需要通過SQL手動添加該字段。

+0

Django不會自動添加一個嗎?當我運行「python manage.py sqlall studentinfo」時,它顯示「'id'整數AUTO_INCREMENT NOT NULL PRIMARY KEY」。 我認爲這個問題可能是因爲表已經創建,syncdb不會使用該自動主鍵創建另一個表。但是因爲我在桌上已經有了預先存在的數據,所以我不知道如何解決這個問題。 – user1265125

+1

是的,Django確實如此,但顯然你並沒有使用Django創建你的表。正如我所說,你需要通過一些'ALTER TABLE'語句手動添加id列。 –

+0

加一,因爲你回答了OP的問題,他們沒有打擾它標記正確(它是)。 – mkoistinen

1

我和遺留數據庫有相同的情況。

問題是,一個香草的查詢集將嘗試獲取id來構建模型對象。我最終做的是使用.values()查詢。這樣,就沒有模型建設,也沒有ID。

+0

聰明的解決方法,而不是創建id,你也可以使用'.values_list()' – ChillarAnand

相關問題