Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #22401 -- Deprecated regular expression parsing of initial SQL …

…in favor of installing sqlparse.
  • Loading branch information...
commit 071c9337750b296d198cced56f3ffad0e176afb6 1 parent 5f2f47f
julien 'pouete' Godin authored timgraham committed
View
35 django/core/management/sql.py
@@ -10,7 +10,7 @@
from django.core.management.base import CommandError
from django.db import models, router
from django.utils import six
-from django.utils.deprecation import RemovedInDjango19Warning
+from django.utils.deprecation import RemovedInDjango19Warning, RemovedInDjango20Warning
def sql_create(app_config, style, connection):
@@ -155,18 +155,27 @@ def sql_all(app_config, style, connection):
def _split_statements(content):
- comment_re = re.compile(r"^((?:'[^']*'|[^'])*?)--.*$")
- statements = []
- statement = []
- for line in content.split("\n"):
- cleaned_line = comment_re.sub(r"\1", line).strip()
- if not cleaned_line:
- continue
- statement.append(cleaned_line)
- if cleaned_line.endswith(";"):
- statements.append(" ".join(statement))
- statement = []
- return statements
+ try:
+ import sqlparse
+ except ImportError:
+ warnings.warn(
+ "Providing intial SQL data works better with sqlparse installed "
+ "and it will be required in Django 2.0.", RemovedInDjango20Warning
+ )
+ comment_re = re.compile(r"^((?:'[^']*'|[^'])*?)--.*$")
+ statements = []
+ statement = []
+ for line in content.split("\n"):
+ cleaned_line = comment_re.sub(r"\1", line).strip()
+ if not cleaned_line:
+ continue
+ statement.append(cleaned_line)
+ if cleaned_line.endswith(";"):
+ statements.append(" ".join(statement))
+ statement = []
+ return statements
+ else:
+ return sqlparse.split(content.strip())
def custom_sql_for_model(model, style, connection):
View
8 docs/howto/initial-data.txt
@@ -103,6 +103,14 @@ directories.
Providing initial SQL data
==========================
+.. deprecated:: 1.8
+
+ Historically this functionality has used regular expression parsing of the
+ initial SQL which is a bit buggy. This parsing is now deprecated in favor
+ of installing `sqlparse <https://pypi.python.org/pypi/sqlparse>`_; doing so
+ will be required for this functionality in Django 2.0. You can install it
+ using ``pip install sqlparse``.
+
Django provides a hook for passing the database arbitrary SQL that's executed
just after the CREATE TABLE statements when you run :djadmin:`migrate`. You can
use this hook to populate default records, or you could also create SQL
View
2  docs/internals/contributing/writing-code/unit-tests.txt
@@ -166,6 +166,7 @@ dependencies:
* memcached_, plus a :ref:`supported Python binding <memcached>`
* gettext_ (:ref:`gettext_on_windows`)
* selenium_
+* sqlparse_
You can find these dependencies in `pip requirements files`_ inside the
``tests/requirements`` directory of the Django source tree and install them
@@ -197,6 +198,7 @@ associated tests will be skipped.
.. _memcached: http://memcached.org/
.. _gettext: http://www.gnu.org/software/gettext/manual/gettext.html
.. _selenium: https://pypi.python.org/pypi/selenium
+.. _sqlparse: https://pypi.python.org/pypi/sqlparse
.. _pip requirements files: http://www.pip-installer.org/en/latest/cookbook.html#requirements-files
Code coverage
View
3  docs/internals/deprecation.txt
@@ -25,6 +25,9 @@ about each item can often be found in the release notes of two versions prior.
* Using an incorrect count of unpacked values in the ``for`` template tag
will raise an exception rather than fail silently.
+* The regular expression parsing of SQL initial data will be removed and
+ ``sqlparse`` will be required for the feature.
+
.. _deprecation-removed-in-1.9:
1.9
View
12 docs/releases/1.8.txt
@@ -128,6 +128,9 @@ Management Commands
* :djadmin:`dumpdata` now has the option :djadminopt:`--output` which allows
specifying the file to which the serialized data is written.
+* :ref:`initial-sql` now works better if the `sqlparse
+ <https://pypi.python.org/pypi/sqlparse>`_ Python library is installed.
+
Models
^^^^^^
@@ -276,3 +279,12 @@ Using an incorrect count of unpacked values in the :ttag:`for` template tag
Using an incorrect count of unpacked values in :ttag:`for` tag will raise an
exception rather than fail silently in Django 2.0.
+
+Regular expression parsing of initial SQL
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The somewhat buggy regular expression logic used for parsing :ref:`SQL initial
+data <initial-sql>` has been deprecated. Install `sqlparse
+<https://pypi.python.org/pypi/sqlparse>`_ if you wish to use this feature.
+Doing so will be required in Django 2.0 when the regular expression logic is
+removed.
View
1  tests/requirements/base.txt
@@ -5,3 +5,4 @@ Pillow
PyYAML
pytz > dev
selenium
+sqlparse
Please sign in to comment.
Something went wrong with that request. Please try again.