#278 closed defect (fixed)
Problems saving objects with non-id primary key fields and SQLite database
Reported by: | Owned by: | Adrian Holovaty | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.0 |
Severity: | normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
There are several problems using models which have a non-id primary_key field, when using a SQLite backend. Can't test this with other databases, unfortunately. If we have a python file like:
from django.core import meta class D(meta.Model): fields = ( meta.CharField('b', maxlength=8, primary_key=True), meta.CharField('c', maxlength=8), ) class B(meta.Model): fields = ( meta.CharField('b', maxlength=8), meta.CharField('c', maxlength=8), )
then we get this problem: saving objects doesn't appear to add them to the database:
Python 2.4.1 (#2, Mar 31 2005, 00:05:10) [GCC 3.3 20030304 (Apple Computer, Inc. build 1666)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from django.models.petrolprices import ds, bs >>> d = ds.D(b="a", c="a") >>> b = bs.B(b="a", c="a") >>> ds.get_list() [] >>> bs.get_list() [] >>> d.save() >>> b.save() >>> ds.get_list() [] >>> bs.get_list() [<B object>]
If, however, we have the python file containing this:
class D(meta.Model): fields = ( meta.CharField('b', maxlength=8, primary_key=True), ) class B(meta.Model): fields = ( meta.CharField('b', maxlength=45), )
Then attempting to save D objects gets a stack trace:
>>> from django.models.petrolprices import ds, bs >>> d = ds.D(b='a') >>> b = bs.B(b='a') >>> ds.get_list() [] >>> bs.get_list() [] >>> b.save() >>> bs.get_list() [<B object>] >>> d.save() Traceback (most recent call last): File "<stdin>", line 1, in ? File "/Users/huw/Source/Django/django/utils/functional.py", line 3, in _curried return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.items())) File "/Users/huw/Source/Django/django/core/meta/__init__.py", line 740, in method_save opts.pk.name), db_values + [getattr(self, opts.pk.name)]) File "/Users/huw/Source/Django/django/core/db/base.py", line 10, in execute result = self.cursor.execute(sql, params) File "/Users/huw/Source/Django/django/core/db/backends/sqlite3.py", line 67, in execute return Database.Cursor.execute(self, query, params) pysqlite2.dbapi2.OperationalError: near "WHERE": syntax error
Note:
See TracTickets
for help on using tickets.
I believe this is fixed by now. Please reopen if it's still a problem.