Md Sirajus Salayhin
Md Sirajus Salayhin

Reputation: 5144

Django showing error while saving data into a model: django.db.utils.IntegrityError: (1048, "Column 'id' cannot be null")

I am writing a script which can pull data from different API's and store into a MySQL database. This application will run from command line. So I am only using Django's ORM.

But when I am creating a model which doesn't have primary key but have a column named id. When I am trying to save data in this model I am getting a error django.db.utils.IntegrityError: (1048, "Column 'id' cannot be null")

I am really confused why this happens. Because from API I get values from id column and there is no chance to get null or empty value for this column.

Please suggest me what I am doing wrong here.

Here is my model:

class Graphite(models.Model):

    class Meta:
        db_table = 'graphite'

    id = models.BigIntegerField()
    full_name = models.CharField(max_length=250, null=True)
    email = models.CharField(max_length=250, null=True)
    status = models.CharField(max_length=150, null=True)

And this is the code when I am trying to save data in this model:

    Graphite.objects.using('database_name').create(
      id=row['id'],
      full_name=row['full_name'],
      email=row['email'],
      status=row['status'])

When saving data into model I am using Graphite.objects.using('database_name'). because I have multiple database connected in this application.

Upvotes: 1

Views: 2583

Answers (4)

turkus
turkus

Reputation: 4903

Well I'm not sure did you use django migrations, but it won't let you create this kind of model in django, where your id property (in model) hasn't primary key as its parameter (mySQL). So why don't you just define:

class Graphite(models.Model):   

    class Meta:
        db_table = 'graphite'           

    id = models.BigIntegerField(primary_key=True)
    full_name = models.CharField(max_length=250, null=True)
    email = models.CharField(max_length=250, null=True)
    status = models.CharField(max_length=150, null=True)

so set primary_key on id? Then you wouldn't have to pass id when creating Graphite.

BUT

If you have to provide id which is something you need to have in every Graphite model and it's something different than primary key, then just define it different, let's say row_id. But you should still have at last one id property in your model with primary_key set to True when you want to have id as BigIntegerField.

EDIT (on the example)

In mySQL execute this command:

ALTER TABLE graphite ADD COLUMN row_id BIGINT;

Then your model should looks like this:

class Graphite(models.Model):   

    class Meta:
        db_table = 'graphite'           

    row_id = models.BigIntegerField()
    full_name = models.CharField(max_length=250, null=True)
    email = models.CharField(max_length=250, null=True)
    status = models.CharField(max_length=150, null=True)

And usage:

Graphite.objects.using('database_name').create(
  row_id=row['id'],
  full_name=row['full_name'],
  email=row['email'],
  status=row['status'])

and that's it.

Upvotes: 1

pd farhad
pd farhad

Reputation: 6432

You are missing your primary key, make sure you have your primary=True and to store your id make another column for it

Upvotes: 0

Ashraful
Ashraful

Reputation: 1974

You are overriding id from default django table id.

so there is no id for primary key. Just make it primary=True. or use another id like graphaite_id

Upvotes: 0

Jahongir Rahmonov
Jahongir Rahmonov

Reputation: 13763

The problem is that you do not have a primary key.

From the docs:

Each model requires exactly one field to have primary_key=True (either explicitly declared or automatically added).

So, you have to make your id field a primary key by adding primary_key=True. Then, it won't complain.

Upvotes: 0

Related Questions