用django设置数据库

时间:2014-08-27 03:18:06

标签: python django sqlite

我用这样的tracks.models创建了一个db:

class Song(models.Model):
    title = models.CharField(max_length=30)
    album = models.ForeignKey(Album)
    def __unicode__(self):
        return self.title

并使用

python manage.py sqall tracks
python manage.py syncdb

然后我将模型更改为

class Song(models.Model):
    songid = models.CharField(max_length=30)
    title = models.CharField(max_length=30)
    album = models.ForeignKey(Album)
    def __unicode__(self):
        return self.title

并且做了

python manage.py sqall tracks
python manage.py syncdb

一次。 sqall的输出:

BEGIN;
CREATE TABLE "tracks_song" (
    "id" integer NOT NULL PRIMARY KEY,
    "songid" varchar(30) NOT NULL,
    "title" varchar(30) NOT NULL,
    "album_id" integer NOT NULL REFERENCES "tracks_album" ("id")
)
;
CREATE INDEX "tracks_song_6781e42a" ON "tracks_song" ("album_id");

COMMIT;

执行syncdb:

Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

但每当我试图访问tracks.models.Song.all()时,它说:

OperationalError: no such column: tracks_song.songid

所以我决定

python manage.py flush
python manage.py sqall tracks
python manage.py syncdb

(相同的输出)

但问题还没有消失,仍然没有这样的专栏:tracks_song.songid。 它背后的问题是什么?

1 个答案:

答案 0 :(得分:0)

python manage.py sqlall app-name只打印SQL语句,而不是创建或更改数据库结构,也就是说,它用于检查或告诉你django在数据库中实际做了什么。 Howerver,django版本< 1.7没有跟踪models.py中的的变化(可以检测到新增或删除现有的类和syncdb),但是你可以使用,或 django 1.7 做这样的事情。

python manage.py flush将不可逆转地删除所有数据,但不会更改数据库中的表格。

http://south.aeracode.org/

Django 1.7: https://docs.djangoproject.com/en/dev/releases/1.7/#django-1-7-release-notes-under-development

你还应该注意到,如果你只需要一个id字段,那么歌曲类有一个默认的自动字段 id ,只需使用 song.id Django models Quick Example