Refs #33308 -- Added DatabaseOperations.compose_sql() on PostgreSQL.

This commit is contained in:
Florian Apolloner 2022-12-12 09:54:49 +01:00 committed by Mariusz Felisiak
parent 1d90c9b113
commit db7bb3b64e
4 changed files with 22 additions and 19 deletions

View File

@ -1,5 +1,3 @@
import psycopg2
from django.db.models import (
CharField,
Expression,
@ -309,14 +307,9 @@ class SearchHeadline(Func):
options_sql = ""
options_params = []
if self.options:
# getquoted() returns a quoted bytestring of the adapted value.
options_params.append(
", ".join(
"%s=%s"
% (
option,
psycopg2.extensions.adapt(value).getquoted().decode(),
)
connection.ops.compose_sql(f"{option}=%s", [value])
for option, value in self.options.items()
)
)

View File

@ -3,7 +3,7 @@ from functools import lru_cache, partial
from django.conf import settings
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.postgresql.psycopg_any import Inet, Jsonb
from django.db.backends.postgresql.psycopg_any import Inet, Jsonb, mogrify
from django.db.backends.utils import split_tzname_delta
from django.db.models.constants import OnConflict
@ -174,6 +174,9 @@ class DatabaseOperations(BaseDatabaseOperations):
return name # Quoting once is enough.
return '"%s"' % name
def compose_sql(self, sql, params):
return mogrify(sql, params, self.connection)
def set_time_zone_sql(self):
return "SET TIME ZONE %s"

View File

@ -24,3 +24,8 @@ def _quote(value, connection=None):
sql.quote = _quote
def mogrify(sql, params, connection):
with connection.cursor() as cursor:
return cursor.mogrify(sql, params).decode()

View File

@ -563,17 +563,19 @@ class InspectDBTransactionalTests(TransactionTestCase):
"CREATE SERVER inspectdb_server FOREIGN DATA WRAPPER file_fdw"
)
cursor.execute(
"""\
CREATE FOREIGN TABLE inspectdb_iris_foreign_table (
petal_length real,
petal_width real,
sepal_length real,
sepal_width real
) SERVER inspectdb_server OPTIONS (
filename %s
connection.ops.compose_sql(
"""
CREATE FOREIGN TABLE inspectdb_iris_foreign_table (
petal_length real,
petal_width real,
sepal_length real,
sepal_width real
) SERVER inspectdb_server OPTIONS (
filename %s
)
""",
[os.devnull],
)
""",
[os.devnull],
)
out = StringIO()
foreign_table_model = "class InspectdbIrisForeignTable(models.Model):"