From fd92f247891950bc92369b2457e032ec11f0147d Mon Sep 17 00:00:00 2001 From: saJaeHyukc <wogur981208@gmail.com> Date: Fri, 13 Sep 2024 20:07:37 +0900 Subject: [PATCH] Fixed #34887 -- Added support for unlimited models.CharField on SQLite. Signed-off-by: saJaeHyukc <wogur981208@gmail.com> --- django/db/backends/sqlite3/base.py | 8 +++++++- django/db/backends/sqlite3/features.py | 1 + docs/ref/models/fields.txt | 8 ++++++-- docs/releases/5.2.txt | 4 ++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index c7cf947800..f7b65651b3 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -40,6 +40,12 @@ def adapt_datetime(val): return val.isoformat(" ") +def _get_varchar_column(data): + if data["max_length"] is None: + return "varchar" + return "varchar(%(max_length)s)" % data + + Database.register_converter("bool", b"1".__eq__) Database.register_converter("date", decoder(parse_date)) Database.register_converter("time", decoder(parse_time)) @@ -62,7 +68,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): "BigAutoField": "integer", "BinaryField": "BLOB", "BooleanField": "bool", - "CharField": "varchar(%(max_length)s)", + "CharField": _get_varchar_column, "DateField": "date", "DateTimeField": "datetime", "DecimalField": "decimal", diff --git a/django/db/backends/sqlite3/features.py b/django/db/backends/sqlite3/features.py index 502d8546e3..669e875b59 100644 --- a/django/db/backends/sqlite3/features.py +++ b/django/db/backends/sqlite3/features.py @@ -60,6 +60,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): """ insert_test_table_with_defaults = 'INSERT INTO {} ("null") VALUES (1)' supports_default_keyword_in_insert = False + supports_unlimited_charfield = True @cached_property def django_test_skips(self): diff --git a/docs/ref/models/fields.txt b/docs/ref/models/fields.txt index 612949ab4a..5266135dd2 100644 --- a/docs/ref/models/fields.txt +++ b/docs/ref/models/fields.txt @@ -720,8 +720,8 @@ The default form widget for this field is a :class:`~django.forms.TextInput`. The maximum length (in characters) of the field. The ``max_length`` is enforced at the database level and in Django's validation using :class:`~django.core.validators.MaxLengthValidator`. It's required for all - database backends included with Django except PostgreSQL, which supports - unlimited ``VARCHAR`` columns. + database backends included with Django except PostgreSQL and SQLite, which + supports unlimited ``VARCHAR`` columns. .. note:: @@ -730,6 +730,10 @@ The default form widget for this field is a :class:`~django.forms.TextInput`. ``max_length`` for some backends. Refer to the :doc:`database backend notes </ref/databases>` for details. + .. versionchanged:: 5.2 + + Support for unlimited ``VARCHAR`` columns was added on SQLite. + .. attribute:: CharField.db_collation Optional. The database collation name of the field. diff --git a/docs/releases/5.2.txt b/docs/releases/5.2.txt index 09d1dff49a..8f969a4b85 100644 --- a/docs/releases/5.2.txt +++ b/docs/releases/5.2.txt @@ -223,6 +223,10 @@ Models expression contains a set-returning function, enforcing subquery evaluation. This is necessary for many Postgres set-returning functions. +* :attr:`CharField.max_length <django.db.models.CharField.max_length>` is no + longer required to be set on SQLite, which supports unlimited ``VARCHAR`` + columns. + Requests and Responses ~~~~~~~~~~~~~~~~~~~~~~