.. autoattribute:: client_encoding
- The property is writable for sync connections, read-only for async
- ones: you should call ``await`` `~AsyncConnection.set_client_encoding`\
- :samp:`({value})` instead.
-
The value returned is always normalized to the Python codec
`~codecs.CodecInfo.name`::
...
.. automethod:: notifies
- .. automethod:: set_client_encoding
.. automethod:: set_autocommit
.. automethod:: set_isolation_level
.. automethod:: set_read_only
pgenc = self.pgconn.parameter_status(b"client_encoding") or b"UTF8"
return encodings.pg2py(pgenc)
- @client_encoding.setter
- def client_encoding(self, name: str) -> None:
- self._set_client_encoding(name)
-
- def _set_client_encoding(self, name: str) -> None:
- raise NotImplementedError
-
- def _set_client_encoding_gen(self, name: str) -> PQGen[None]:
- self.pgconn.send_query_params(
- b"SELECT set_config('client_encoding', $1, false)",
- [encodings.py2pg(name)],
- )
- (result,) = yield from execute(self.pgconn)
- if result.status != ExecStatus.TUPLES_OK:
- raise e.error_from_result(result, encoding=self.client_encoding)
-
@property
def info(self) -> ConnectionInfo:
"""A `ConnectionInfo` attribute to inspect connection properties."""
def _set_deferrable(self, value: Optional[bool]) -> None:
with self.lock:
super()._set_deferrable(value)
-
- def _set_client_encoding(self, name: str) -> None:
- with self.lock:
- self.wait(self._set_client_encoding_gen(name))
async with self.lock:
super()._set_deferrable(value)
- def _set_client_encoding(self, name: str) -> None:
- self._no_set_async("client_encoding")
-
- async def set_client_encoding(self, name: str) -> None:
- """Async version of the `~Connection.client_encoding` setter."""
- async with self.lock:
- await self.wait(self._set_client_encoding_gen(name))
-
def _no_set_async(self, attribute: str) -> None:
raise AttributeError(
f"'the {attribute!r} property is read-only on async connections:"
assert conn.client_encoding == encodings.pg2py(enc)
-def test_set_encoding(conn):
- newenc = "iso8859-1" if conn.client_encoding != "iso8859-1" else "utf-8"
- assert conn.client_encoding != newenc
- conn.client_encoding = newenc
- assert conn.client_encoding == newenc
- (enc,) = conn.cursor().execute("show client_encoding").fetchone()
- assert encodings.pg2py(enc) == newenc
-
-
@pytest.mark.parametrize(
"enc, out, codec",
[
],
)
def test_normalize_encoding(conn, enc, out, codec):
- conn.client_encoding = enc
+ conn.execute("select set_config('client_encoding', %s, false)", [enc])
assert conn.pgconn.parameter_status(b"client_encoding").decode() == out
assert conn.client_encoding == codec
cur.execute("select 'x'")
-def test_set_encoding_bad(conn):
- with pytest.raises(LookupError):
- conn.client_encoding = "WAT"
-
-
@pytest.mark.parametrize(
"args, kwargs, want",
[
assert aconn.client_encoding == encodings.pg2py(enc)
-async def test_set_encoding(aconn):
- newenc = "iso8859-1" if aconn.client_encoding != "iso8859-1" else "utf-8"
- assert aconn.client_encoding != newenc
- with pytest.raises(AttributeError):
- aconn.client_encoding = newenc
- assert aconn.client_encoding != newenc
- await aconn.set_client_encoding(newenc)
- assert aconn.client_encoding == newenc
- cur = aconn.cursor()
- await cur.execute("show client_encoding")
- (enc,) = await cur.fetchone()
- assert encodings.pg2py(enc) == newenc
-
-
@pytest.mark.parametrize(
"enc, out, codec",
[
],
)
async def test_normalize_encoding(aconn, enc, out, codec):
- await aconn.set_client_encoding(enc)
+ await aconn.execute(
+ "select set_config('client_encoding', %s, false)", [enc]
+ )
assert aconn.pgconn.parameter_status(b"client_encoding").decode() == out
assert aconn.client_encoding == codec
await cur.execute("select 'x'")
-async def test_set_encoding_bad(aconn):
- with pytest.raises(LookupError):
- await aconn.set_client_encoding("WAT")
-
-
@pytest.mark.parametrize(
"args, kwargs, want",
[
def test_copy_out_allchars(conn, format):
cur = conn.cursor()
chars = list(map(chr, range(1, 256))) + [eur]
- conn.client_encoding = "utf8"
+ conn.execute("set client_encoding to utf8")
rows = []
query = sql.SQL(
"copy (select unnest({}::text[])) to stdout (format {})"
cur = conn.cursor()
ensure_table(cur, sample_tabledef)
- conn.client_encoding = "utf8"
+ conn.execute("set client_encoding to utf8")
with cur.copy("copy copy_in from stdin (format text)") as copy:
for i in range(1, 256):
copy.write_row((i, None, chr(i)))
async def test_copy_out_allchars(aconn, format):
cur = aconn.cursor()
chars = list(map(chr, range(1, 256))) + [eur]
- await aconn.set_client_encoding("utf8")
+ await aconn.execute("set client_encoding to utf8")
rows = []
query = sql.SQL(
"copy (select unnest({}::text[])) to stdout (format {})"
cur = aconn.cursor()
await ensure_table(cur, sample_tabledef)
- await aconn.set_client_encoding("utf8")
+ await aconn.execute("set client_encoding to utf8")
async with cur.copy("copy copy_in from stdin (format text)") as copy:
for i in range(1, 256):
await copy.write_row((i, None, chr(i)))
@pytest.mark.parametrize("encoding", ["utf8", "latin9"])
def test_query_encode(conn, encoding):
- conn.client_encoding = encoding
+ conn.execute(f"set client_encoding to {encoding}")
cur = conn.cursor()
(res,) = cur.execute("select '\u20ac'").fetchone()
assert res == "\u20ac"
def test_query_badenc(conn):
- conn.client_encoding = "latin1"
+ conn.execute("set client_encoding to latin1")
cur = conn.cursor()
with pytest.raises(UnicodeEncodeError):
cur.execute("select '\u20ac'")
@pytest.mark.parametrize("encoding", ["utf8", "latin9"])
async def test_query_encode(aconn, encoding):
- await aconn.set_client_encoding(encoding)
+ await aconn.execute(f"set client_encoding to {encoding}")
cur = aconn.cursor()
await cur.execute("select '\u20ac'")
(res,) = await cur.fetchone()
async def test_query_badenc(aconn):
- await aconn.set_client_encoding("latin1")
+ await aconn.execute("set client_encoding to latin1")
cur = aconn.cursor()
with pytest.raises(UnicodeEncodeError):
await cur.execute("select '\u20ac'")
msgs = []
conn.pgconn.exec_(b"set client_min_messages to notice")
conn.add_notice_handler(lambda diag: msgs.append(diag.message_primary))
- conn.client_encoding = enc
+ conn.execute(f"set client_encoding to {enc}")
cur = conn.cursor()
cur.execute(
"do $$begin raise notice 'hello %', chr(8364); end$$ language plpgsql"
@pytest.mark.parametrize("enc", ["utf8", "latin9"])
def test_error_encoding(conn, enc):
- conn.client_encoding = enc
+ with conn.transaction():
+ conn.execute(f"set client_encoding to {enc}")
cur = conn.cursor()
with pytest.raises(e.DatabaseError) as excinfo:
cur.execute(
from psycopg import pq, sql, ProgrammingError
from psycopg.adapt import PyFormat
+from psycopg._encodings import py2pgenc
eur = "\u20ac"
)
def test_as_bytes(self, conn, args, want, enc):
want = want.encode(enc)
- conn.client_encoding = enc
+ conn.execute(f"set client_encoding to {py2pgenc(enc).decode()}")
assert sql.Identifier(*args).as_bytes(conn) == want
def test_join(self):
sql.Literal(dt.date(2017, 1, 1)).as_bytes(conn) == b"'2017-01-01'"
)
- conn.client_encoding = "utf8"
+ conn.execute("set client_encoding to utf8")
assert sql.Literal(eur).as_bytes(conn) == f"'{eur}'".encode()
- conn.client_encoding = "latin9"
+ conn.execute("set client_encoding to latin9")
assert sql.Literal(eur).as_bytes(conn) == f"'{eur}'".encode("latin9")
def test_eq(self):
def test_as_bytes(self, conn):
assert sql.SQL("foo").as_bytes(conn) == b"foo"
- conn.client_encoding = "utf8"
+ conn.execute("set client_encoding to utf8")
assert sql.SQL(eur).as_bytes(conn) == eur.encode()
- conn.client_encoding = "latin9"
+ conn.execute("set client_encoding to latin9")
assert sql.SQL(eur).as_bytes(conn) == eur.encode("latin9")
obj = sql.Composed([sql.SQL("foo"), sql.SQL(eur)])
- conn.client_encoding = "utf8"
+ conn.execute("set client_encoding to utf8")
assert obj.as_bytes(conn) == ("foo" + eur).encode()
- conn.client_encoding = "latin9"
+ conn.execute("set client_encoding to latin9")
assert obj.as_bytes(conn) == ("foo" + eur).encode("latin9")
@pytest.mark.parametrize("fmt_in", PyFormat)
-@pytest.mark.parametrize("encoding", ["utf8", "latin9", "ascii"])
+@pytest.mark.parametrize("encoding", ["utf8", "latin9", "sql_ascii"])
def test_dump_enc(conn, fmt_in, encoding):
cur = conn.cursor()
- conn.client_encoding = encoding
+ conn.execute(f"set client_encoding to {encoding}")
(res,) = cur.execute(f"select ascii(%{fmt_in})", (eur,)).fetchone()
assert res == ord(eur)
def test_dump_badenc(conn, fmt_in):
cur = conn.cursor()
- conn.client_encoding = "latin1"
+ conn.execute("set client_encoding to latin1")
with pytest.raises(UnicodeEncodeError):
cur.execute(f"select %{fmt_in}::bytea", (eur,))
def test_dump_utf8_badenc(conn, fmt_in):
cur = conn.cursor()
- conn.client_encoding = "utf-8"
+ conn.execute("set client_encoding to utf8")
with pytest.raises(UnicodeEncodeError):
cur.execute(f"select %{fmt_in}", ("\uddf8",))
def test_load_enc(conn, typename, encoding, fmt_out):
cur = conn.cursor(binary=fmt_out)
- conn.client_encoding = encoding
- (res,) = cur.execute(f"select chr(%s)::{typename}", (ord(eur),)).fetchone()
+ conn.execute(f"set client_encoding to {encoding}")
+ (res,) = cur.execute(f"select chr(%s)::{typename}", [ord(eur)]).fetchone()
assert res == eur
stmt = sql.SQL("copy (select chr({})) to stdout (format {})").format(
conn.autocommit = True
cur = conn.cursor(binary=fmt_out)
- conn.client_encoding = "latin1"
+ conn.execute("set client_encoding to latin1")
with pytest.raises(psycopg.DataError):
- cur.execute(f"select chr(%s)::{typename}", (ord(eur),))
+ cur.execute(f"select chr(%s)::{typename}", [ord(eur)])
stmt = sql.SQL("copy (select chr({})) to stdout (format {})").format(
ord(eur), sql.SQL(fmt_out.name)
def test_load_ascii(conn, typename, fmt_out):
cur = conn.cursor(binary=fmt_out)
- conn.client_encoding = "ascii"
- cur.execute(f"select chr(%s)::{typename}", (ord(eur),))
+ conn.execute("set client_encoding to sql_ascii")
+ cur.execute(f"select chr(%s)::{typename}", [ord(eur)])
assert cur.fetchone()[0] == eur.encode()
stmt = sql.SQL("copy (select chr({})) to stdout (format {})").format(
@pytest.mark.parametrize("fmt_in", PyFormat)
@pytest.mark.parametrize("fmt_out", pq.Format)
def test_text_array_ascii(conn, fmt_in, fmt_out):
- conn.client_encoding = "ascii"
+ conn.execute("set client_encoding to sql_ascii")
cur = conn.cursor(binary=fmt_out)
a = list(map(chr, range(1, 256))) + [eur]
exp = [s.encode() for s in a]