Loading django/db/backends/postgresql_psycopg2/base.py +13 −4 Original line number Diff line number Diff line Loading @@ -174,9 +174,18 @@ class DatabaseWrapper(BaseDatabaseWrapper): conn_params['port'] = settings_dict['PORT'] self.connection = Database.connect(**conn_params) self.connection.set_client_encoding('UTF8') # Set the time zone in autocommit mode (see #17062) tz = 'UTC' if settings.USE_TZ else settings_dict.get('TIME_ZONE') if tz: try: get_parameter_status = self.connection.get_parameter_status except AttributeError: # psycopg2 < 2.0.12 doesn't have get_parameter_status conn_tz = None else: conn_tz = get_parameter_status('TimeZone') if conn_tz != tz: # Set the time zone in autocommit mode (see #17062) self.connection.set_isolation_level( psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) self.connection.cursor().execute("SET TIME ZONE %s", [tz]) Loading docs/ref/databases.txt +22 −3 Original line number Diff line number Diff line Loading @@ -33,6 +33,26 @@ aggregate with a database backend that falls within the affected release range. .. _known to be faulty: http://archives.postgresql.org/pgsql-bugs/2007-07/msg00046.php .. _Release 8.2.5: http://developer.postgresql.org/pgdocs/postgres/release-8-2-5.html Optimizing PostgreSQL's configuration ------------------------------------- Django needs the following parameters for its database connections: - ``client_encoding``: ``'UTF8'``, - ``default_transaction_isolation``: ``'read committed'``, - ``timezone``: ``'UTC'`` when :setting:`USE_TZ` is ``True``, value of :setting:`TIME_ZONE` otherwise. If these parameters already have the correct values, Django won't set them for every new connection, which improves performance slightly. You can configure them directly in :file:`postgresql.conf` or more conveniently per database user with `ALTER ROLE`_. Django will work just fine without this optimization, but each new connection will do some additional queries to set these parameters. .. _ALTER ROLE: http://www.postgresql.org/docs/current/interactive/sql-alterrole.html Transaction handling --------------------- Loading @@ -48,9 +68,8 @@ Autocommit mode If your application is particularly read-heavy and doesn't make many database writes, the overhead of a constantly open transaction can sometimes be noticeable. For those situations, if you're using the ``postgresql_psycopg2`` backend, you can configure Django to use *"autocommit"* behavior for the connection, meaning that each database sometimes be noticeable. For those situations, you can configure Django to use *"autocommit"* behavior for the connection, meaning that each database operation will normally be in its own transaction, rather than having the transaction extend over multiple operations. In this case, you can still manually start a transaction if you're doing something that Loading Loading
django/db/backends/postgresql_psycopg2/base.py +13 −4 Original line number Diff line number Diff line Loading @@ -174,9 +174,18 @@ class DatabaseWrapper(BaseDatabaseWrapper): conn_params['port'] = settings_dict['PORT'] self.connection = Database.connect(**conn_params) self.connection.set_client_encoding('UTF8') # Set the time zone in autocommit mode (see #17062) tz = 'UTC' if settings.USE_TZ else settings_dict.get('TIME_ZONE') if tz: try: get_parameter_status = self.connection.get_parameter_status except AttributeError: # psycopg2 < 2.0.12 doesn't have get_parameter_status conn_tz = None else: conn_tz = get_parameter_status('TimeZone') if conn_tz != tz: # Set the time zone in autocommit mode (see #17062) self.connection.set_isolation_level( psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) self.connection.cursor().execute("SET TIME ZONE %s", [tz]) Loading
docs/ref/databases.txt +22 −3 Original line number Diff line number Diff line Loading @@ -33,6 +33,26 @@ aggregate with a database backend that falls within the affected release range. .. _known to be faulty: http://archives.postgresql.org/pgsql-bugs/2007-07/msg00046.php .. _Release 8.2.5: http://developer.postgresql.org/pgdocs/postgres/release-8-2-5.html Optimizing PostgreSQL's configuration ------------------------------------- Django needs the following parameters for its database connections: - ``client_encoding``: ``'UTF8'``, - ``default_transaction_isolation``: ``'read committed'``, - ``timezone``: ``'UTC'`` when :setting:`USE_TZ` is ``True``, value of :setting:`TIME_ZONE` otherwise. If these parameters already have the correct values, Django won't set them for every new connection, which improves performance slightly. You can configure them directly in :file:`postgresql.conf` or more conveniently per database user with `ALTER ROLE`_. Django will work just fine without this optimization, but each new connection will do some additional queries to set these parameters. .. _ALTER ROLE: http://www.postgresql.org/docs/current/interactive/sql-alterrole.html Transaction handling --------------------- Loading @@ -48,9 +68,8 @@ Autocommit mode If your application is particularly read-heavy and doesn't make many database writes, the overhead of a constantly open transaction can sometimes be noticeable. For those situations, if you're using the ``postgresql_psycopg2`` backend, you can configure Django to use *"autocommit"* behavior for the connection, meaning that each database sometimes be noticeable. For those situations, you can configure Django to use *"autocommit"* behavior for the connection, meaning that each database operation will normally be in its own transaction, rather than having the transaction extend over multiple operations. In this case, you can still manually start a transaction if you're doing something that Loading