Django - DatabaseError: No such table

31,145

Solution 1

Actually the problem was that the table never got created. Since I am fairly new with django, I did not know that ./manage.py syncdb does not update existing models, but only creates the ones that do not exist.

Because the model 'Server' existed before I added the other model, and it was already in the db, 'syncdb' did not actually create the new tables.

Solution 2

As a tip for the future, look into South, a very useful utility for applying your model changes to the database without having to create a new database each time you've changed the model(s).

With it you can easily: python manage.py migrate app_name and South will write your model changes. The documentation is pretty straightforward.

Solution 3

I meet the same problem today and fix it. I think you miss some command in tutorial 1. just do follow:

./python manage.py makemigrations polls
python manage.py sql polls
./python manage.py syncdb

then fix it and gain the table polls and you can see the table created. you should read the manage.py makemigrations command.

Solution 4

for django 1.9, this is what i did and it solved the issue.

python manage.py makemigrations app_name

python manage.py migrate

Share:
31,145
varesa
Author by

varesa

Updated on May 29, 2020

Comments

  • varesa
    varesa almost 4 years

    I defined two models:

    class Server(models.Model):
        owners = models.ManyToManyField('Person')
    
    class Person(models.Model):
        name = models.CharField(max_length=50)
    
    admin.site.register(Server)
    admin.site.register(Person)
    

    After that I even checked the sql, just for fun:

    BEGIN;
    CREATE TABLE "servers_server_owners" (
        "id" integer NOT NULL PRIMARY KEY,
        "server_id" integer NOT NULL,
        "person_id" integer NOT NULL,
        UNIQUE ("server_id", "person_id")
    )
    ;
    CREATE TABLE "servers_server" (
        "id" integer NOT NULL PRIMARY KEY,
        "name" varchar(50) NOT NULL,
        "port" integer unsigned NOT NULL,
        "state" integer NOT NULL
    )
    ;
    CREATE TABLE "servers_person" (
        "id" integer NOT NULL PRIMARY KEY,
        "name" varchar(50) NOT NULL
    )
    ;
    COMMIT;
    

    There it even says CREATE TABLE "servers_server_owners"

    I ran syncdb to install the new models to the database. I went to the admin-interface to define some objects to play with, but I got the following error:

    DatabaseError at /admin/servers/server/1/  
    no such table: servers_server_owners
    

    I shutdown the dev-server, ran syncdb again, started the server: Still same problem. Why can't it find, the table, even though it just told me it created id?