On May 21, 2013, at 8:04 AM, Tom Evans wrote:
> 
> The purpose of using an ORM is to make your application database
> agnostic. You should not find that changing DB engine is overly
> taxing.

Theoretically, yes. The difference between theory and practice is very small in 
theory, and not so much in practice. ;-)

Theoretically, the ORM should protect you from differences between databases. 
In practice, this doesn't always happen. 

There *are* real world differences between running different databases on the 
same ORM. Quoting the purpose of an ORM and telling someone they "should not" 
have a problem is naive, sorry.

While some of these differences can be avoided, doing so requires the developer 
to know that they exist in the first place, thus negating the purpose of using 
an ORM. Given the character of the question by the original poster, I suspect 
he might have issues with this.

PostgreSQL is very strict by default. SQLite is very forgiving. 

You can also run into problems with South migrations working on one and not the 
other.


> Not all of these statements are wholly accurate, mysql will re-use
> keys when necessary (but doesn't try to 'back fill' the set of used
> ids), and

The statements don't need to be "wholly accurate". The behavior is different in 
practice.


> mysql is also perfectly happy with 0 as a primary key, but
> will replace it with the next auto increment id if the field is an
> auto increment field.

class Moo(models.Model):
    name = models.CharField(max_length=50)

moo.json:
[
    {
        "pk": 0,
        "model": "test.moo",
        "fields": {
            "name": "Test"
        }
    }
]

Running as MySQL:
anderson$ python manage.py loaddata moo.json
ValueError: Problem installing fixture 
'/Users/anderson/src/.../fixtures/moo_genre.json': The database backend does 
not accept 0 as a value for AutoField.

Running as Sqlite:
anderson$ python manage.py loaddata moo.json
Installed 1 object(s) from 1 fixture(s)

If your real world dataset includes a row with 0 as the primary key, you need 
to be aware of this.

> There is no 'natural ordering' of un-ordered
> results, the order is undefined, and undefined behaviour is undefined.

In theory, yes. However, the naive developer may observe that this ordering is 
actually implementation-specific under the hood and write code based on that 
fact, and in doing so tie the code to a particular implementation. Yes, you 
should always include an order_by if your use case depends on ordering. No, not 
everyone realizes that.


> The point is, installing and learning the ins and outs of an RDBMS is
> not necessary to using Django. If you think you are stuck trying to
> install or understand postgres, just ignore it and use sqlite. You can
> always change at a later date.

And my point is that there remain ins and outs of the various database backends 
that prevent seamless migration between them.

At some point you will need to install and test on your production database. 
Why not do it first and avoid possible incompatibilities between dev and 
production down the way?

If you're just learning, that's fine. No need. But as soon as you're on an 
actual project, do yourself a favor and develop on the platform you plan on 
using in production.

Regards,
-scott

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to