From: Daniele Varrazzo Date: Thu, 12 May 2022 14:46:28 +0000 (+0200) Subject: feat: add ClientCursor.mogrify() X-Git-Tag: 3.1~99^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79df885340f0d9c437fd8fa9838b78136ab68bce;p=thirdparty%2Fpsycopg.git feat: add ClientCursor.mogrify() --- diff --git a/psycopg/psycopg/client_cursor.py b/psycopg/psycopg/client_cursor.py index 177fb7840..851b1cec6 100644 --- a/psycopg/psycopg/client_cursor.py +++ b/psycopg/psycopg/client_cursor.py @@ -9,6 +9,7 @@ from functools import partial from ._queries import PostgresQuery, PostgresClientQuery +from . import adapt from . import errors as e from .pq import Format from .abc import ConnectionType, Query, Params @@ -23,6 +24,14 @@ if TYPE_CHECKING: class ClientCursorMixin(BaseCursor[ConnectionType, Row]): + def mogrify(self, query: Query, params: Optional[Params] = None) -> str: + """ + Return the query to be executed with parameters merged. + """ + self._tx = adapt.Transformer(self) + pgq = self._convert_query(query, params) + return pgq.query.decode(self._tx.encoding) + def _execute_send( self, query: PostgresQuery, diff --git a/tests/test_client_cursor.py b/tests/test_client_cursor.py index d5b6193f1..dc5b22edb 100644 --- a/tests/test_client_cursor.py +++ b/tests/test_client_cursor.py @@ -1,6 +1,7 @@ import gc import pickle import weakref +import datetime as dt from typing import List import pytest @@ -767,3 +768,24 @@ def test_leak(dsn, faker, fetch, row_factory): gc_collect() n.append(len(gc.get_objects())) assert n[0] == n[1] == n[2], f"objects leaked: {n[1] - n[0]}, {n[2] - n[1]}" + + +def test_mogrify(conn): + cur = conn.cursor() + q = cur.mogrify("select 'hello'") + assert q == "select 'hello'" + + q = cur.mogrify("select %s, %s", [1, dt.date(2020, 1, 1)]) + assert q == "select 1, '2020-01-01'::date" + + conn.execute("set client_encoding to utf8") + q = cur.mogrify("select %(s)s", {"s": "\u20ac"}) + assert q == "select '\u20ac'" + + conn.execute("set client_encoding to latin9") + q = cur.mogrify("select %(s)s", {"s": "\u20ac"}) + assert q == "select '\u20ac'" + + conn.execute("set client_encoding to latin1") + with pytest.raises(UnicodeEncodeError): + cur.mogrify("select %(s)s", {"s": "\u20ac"}) diff --git a/tests/test_client_cursor_async.py b/tests/test_client_cursor_async.py index aa0c8f8ef..f4d7dc8bb 100644 --- a/tests/test_client_cursor_async.py +++ b/tests/test_client_cursor_async.py @@ -1,6 +1,7 @@ import gc import pytest import weakref +import datetime as dt from typing import List import psycopg @@ -640,3 +641,24 @@ async def test_leak(dsn, faker, fetch, row_factory): n.append(len(gc.get_objects())) assert n[0] == n[1] == n[2], f"objects leaked: {n[1] - n[0]}, {n[2] - n[1]}" + + +async def test_mogrify(aconn): + cur = aconn.cursor() + q = cur.mogrify("select 'hello'") + assert q == "select 'hello'" + + q = cur.mogrify("select %s, %s", [1, dt.date(2020, 1, 1)]) + assert q == "select 1, '2020-01-01'::date" + + await aconn.execute("set client_encoding to utf8") + q = cur.mogrify("select %(s)s", {"s": "\u20ac"}) + assert q == "select '\u20ac'" + + await aconn.execute("set client_encoding to latin9") + q = cur.mogrify("select %(s)s", {"s": "\u20ac"}) + assert q == "select '\u20ac'" + + await aconn.execute("set client_encoding to latin1") + with pytest.raises(UnicodeEncodeError): + cur.mogrify("select %(s)s", {"s": "\u20ac"})