Commit 6ab3fea1 authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

Fixed #8901 -- Reapplied r13328 (with extra docs) now that we have a 1.3 development branch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@13363 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent b46639f5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -220,6 +220,7 @@ answer newbie questions, and generally made Django that much better:
    Kieran Holland <http://www.kieranholland.com>
    Sung-Jin Hong <serialx.net@gmail.com>
    Leo "hylje" Honkanen <sealage@gmail.com>
    Matt Hoskins <skaffenuk@googlemail.com>
    Tareque Hossain <http://www.codexn.com>
    Richard House <Richard.House@i-logue.com>
    Robert Rock Howard <http://djangomojo.com/>
+2 −1
Original line number Diff line number Diff line
from django.db.backends.creation import BaseDatabaseCreation
from django.db.backends.util import truncate_name

class DatabaseCreation(BaseDatabaseCreation):
    # This dictionary maps Field objects to their associated PostgreSQL column
@@ -51,7 +52,7 @@ class DatabaseCreation(BaseDatabaseCreation):

            def get_index_sql(index_name, opclass=''):
                return (style.SQL_KEYWORD('CREATE INDEX') + ' ' +
                        style.SQL_TABLE(qn(index_name)) + ' ' +
                        style.SQL_TABLE(qn(truncate_name(index_name,self.connection.ops.max_name_length()))) + ' ' +
                        style.SQL_KEYWORD('ON') + ' ' +
                        style.SQL_TABLE(qn(db_table)) + ' ' +
                        "(%s%s)" % (style.SQL_FIELD(qn(f.column)), opclass) +
+19 −11
Original line number Diff line number Diff line
@@ -54,7 +54,9 @@ class DatabaseOperations(BaseDatabaseOperations):
        return '%s'

    def last_insert_id(self, cursor, table_name, pk_name):
        cursor.execute("SELECT CURRVAL('\"%s_%s_seq\"')" % (table_name, pk_name))
        # Use pg_get_serial_sequence to get the underlying sequence name
        # from the table name and column name (available since PostgreSQL 8)
        cursor.execute("SELECT CURRVAL(pg_get_serial_sequence('%s','%s'))" % (table_name, pk_name))
        return cursor.fetchone()[0]

    def no_limit_value(self):
@@ -90,13 +92,14 @@ class DatabaseOperations(BaseDatabaseOperations):
            for sequence_info in sequences:
                table_name = sequence_info['table']
                column_name = sequence_info['column']
                if column_name and len(column_name) > 0:
                    sequence_name = '%s_%s_seq' % (table_name, column_name)
                else:
                    sequence_name = '%s_id_seq' % table_name
                sql.append("%s setval('%s', 1, false);" % \
                if not (column_name and len(column_name) > 0):
                    # This will be the case if it's an m2m using an autogenerated
                    # intermediate table (see BaseDatabaseIntrospection.sequence_list)
                    column_name = 'id'
                sql.append("%s setval(pg_get_serial_sequence('%s','%s'), 1, false);" % \
                    (style.SQL_KEYWORD('SELECT'),
                    style.SQL_FIELD(self.quote_name(sequence_name)))
                    style.SQL_TABLE(table_name),
                    style.SQL_FIELD(column_name))
                )
            return sql
        else:
@@ -110,11 +113,15 @@ class DatabaseOperations(BaseDatabaseOperations):
            # Use `coalesce` to set the sequence for each model to the max pk value if there are records,
            # or 1 if there are none. Set the `is_called` property (the third argument to `setval`) to true
            # if there are records (as the max pk value is already in use), otherwise set it to false.
            # Use pg_get_serial_sequence to get the underlying sequence name from the table name
            # and column name (available since PostgreSQL 8)

            for f in model._meta.local_fields:
                if isinstance(f, models.AutoField):
                    output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
                    output.append("%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
                        (style.SQL_KEYWORD('SELECT'),
                        style.SQL_FIELD(qn('%s_%s_seq' % (model._meta.db_table, f.column))),
                        style.SQL_TABLE(model._meta.db_table),
                        style.SQL_FIELD(f.column),
                        style.SQL_FIELD(qn(f.column)),
                        style.SQL_FIELD(qn(f.column)),
                        style.SQL_KEYWORD('IS NOT'),
@@ -123,9 +130,10 @@ class DatabaseOperations(BaseDatabaseOperations):
                    break # Only one AutoField is allowed per model, so don't bother continuing.
            for f in model._meta.many_to_many:
                if not f.rel.through:
                    output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
                    output.append("%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
                        (style.SQL_KEYWORD('SELECT'),
                        style.SQL_FIELD(qn('%s_id_seq' % f.m2m_db_table())),
                        style.SQL_TABLE(model._meta.db_table),
                        style.SQL_FIELD('id'),
                        style.SQL_FIELD(qn('id')),
                        style.SQL_FIELD(qn('id')),
                        style.SQL_KEYWORD('IS NOT'),
+19 −0
Original line number Diff line number Diff line
@@ -18,6 +18,22 @@ documentation or reference manuals.
PostgreSQL notes
================

.. versionchanged:: 1.3

Django supports PostgreSQL 8.0 and higher. If you want to use
:ref:`database-level autocommit <postgresql-autocommit-mode>`, a
minimum version of PostgreSQL 8.2 is required.

.. admonition:: Improvements in recent PostgreSQL versions

    PostgreSQL 8.0 and 8.1 `will soon reach end-of-life`_; there have
    also been a number of significant performance improvements added
    in recent PostgreSQL versions. Although PostgreSQL 8.0 is the minimum
    supported version, you would be well advised to use a more recent
    version if at all possible.

.. _will soon reach end-of-life: http://wiki.postgresql.org/wiki/PostgreSQL_Release_Support_Policy

PostgreSQL 8.2 to 8.2.4
-----------------------

@@ -39,6 +55,8 @@ database connection is first used and commits the result at the end of the
request/response handling. The PostgreSQL backends normally operate the same
as any other Django backend in this respect.

.. _postgresql-autocommit-mode:

Autocommit mode
~~~~~~~~~~~~~~~

@@ -84,6 +102,7 @@ protection for multi-call operations.

Indexes for ``varchar`` and ``text`` columns
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. versionadded:: 1.1.2

When specifying ``db_index=True`` on your model fields, Django typically
+18 −1
Original line number Diff line number Diff line
from django.conf import settings
from django.db import models
from django.db import connection
from django.db import connection, DEFAULT_DB_ALIAS


class Square(models.Model):
    root = models.IntegerField()
@@ -8,6 +10,7 @@ class Square(models.Model):
    def __unicode__(self):
        return "%s ** 2 == %s" % (self.root, self.square)


class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
@@ -15,11 +18,25 @@ class Person(models.Model):
    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)


class SchoolClass(models.Model):
    year = models.PositiveIntegerField()
    day = models.CharField(max_length=9, blank=True)
    last_updated = models.DateTimeField()

# Unfortunately, the following model breaks MySQL hard.
# Until #13711 is fixed, this test can't be run under MySQL.
if settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'] != 'django.db.backends.mysql':
    class VeryLongModelNameZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ(models.Model):
        class Meta:
            # We need to use a short actual table name or
            # we hit issue #8548 which we're not testing!
            verbose_name = 'model_with_long_table_name'
        primary_key_is_quite_long_zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz = models.AutoField(primary_key=True)
        charfield_is_quite_long_zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz = models.CharField(max_length=100)
        m2m_also_quite_long_zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz = models.ManyToManyField(Person,blank=True)


qn = connection.ops.quote_name

__test__ = {'API_TESTS': """
Loading