Opened 12 years ago
Closed 12 years ago
#20588 closed Bug (invalid)
TypeError: 'NoneType' object has no attribute '__getitem__' in fetch_returned_insert_id function
| Reported by: | Owned by: | tazo90 | |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 1.4 |
| Severity: | Normal | Keywords: | psycopg2, fetch_returned_insert_id |
| Cc: | tazo90@… | Triage Stage: | Unreviewed |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 137, in create
return self.get_query_set().create(**kwargs)
File "C:\Python27\lib\site-packages\django\db\models\query.py", line 377, in create
obj.save(force_insert=True, using=self.db)
File "C:\Python27\lib\site-packages\django\db\models\base.py", line 463, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "C:\Python27\lib\site-packages\django\db\models\base.py", line 551, in save_base
result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)
File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 203, in _insert
return insert_query(self.model, objs, fields, **kwargs)
File "C:\Python27\lib\site-packages\django\db\models\query.py", line 1593, in insert_query
return query.get_compiler(using=using).execute_sql(return_id)
File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py", line 914, in execute_sql
return self.connection.ops.fetch_returned_insert_id(cursor)
File "C:\Python27\lib\site-packages\django\db\backends\__init__.py", line 548, in fetch_returned_insert_id
return cursor.fetchone()[0]
TypeError: 'NoneType' object has no attribute '__getitem__'
It happened when I was trying to use plpgsql trigger from custom sql that returned NULL.
The error means we tried to do something like None[0]. In the backtrace, it says return cursor.fetchone()[0], which means that your cursor.fetchone() is None.
Fix code, you have to change:
return cursor.fetchone()[0]
from C:\Python27\lib\site-packages\django\db\backends\init.py", line 548, in fetch_returned_insert_id to:
res = cursor.fetchone()
if res:
return res[0]
else:
return None
After that change, everything is working.
Change History (2)
comment:1 by , 12 years ago
comment:2 by , 12 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
Note:
See TracTickets
for help on using tickets.
I don't think the proposed change is correct. For create() to work as specified it needs to set the primary key value unless that is already set. The proposed change silently lets create() skip setting the primary key value. Errors should never pass silently, unless explicitly silenced. I think you can actually silence this in 1.6 by overriding the _do_insert() method (internal API).