Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django - syncdb doesn't create tables

Tags:

python

django

I added a many-to-many field to an existing model and was expecting syncdb to create a new table, but there's nothing there. This is what the model looks like:

class Author(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()

    def __unicode__(self):
        return "{0} {1}".format(self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)

    def __unicode__(self):
        return self.title

Running sql myapp prints the correct statements with the new table, but this is not reflected when I run syncdb. validate also returns no errors. Does anyone know what could be the matter here? Or a better diagnostic?

like image 578
serverpunk Avatar asked Dec 24 '12 01:12

serverpunk


2 Answers

The syncdb command does not create many to many tables for existing models by design. This decision is explained on ticket 2229.

That leaves you with a few options.

  • If you don't have any data in your Book model, drop the table and rerun syncdb. Django will recreate the book table and the many to many table.
  • Use the dbshell command, and create the many to many joining table using the output of sql myapp.
  • If you're doing multiple schema migrations with Django, make friends with South.
like image 71
Alasdair Avatar answered Sep 17 '22 23:09

Alasdair


I found this explanation at the django docs useful: SchemaEvolution.

The de facto standard for database migration is Django South.

Its not perfect, but, it works pretty well. You should always check(and edit if necessary) your migration file before running it, to make sure that it actually does what it supposed to do. You can check out their tutorial here.

Also, if you run:

python manage.py inspectdb > somefile.txt

You can get quickly check out if your database structure is matching your django models.

like image 36
edu222 Avatar answered Sep 19 '22 23:09

edu222