from typing import TYPE_CHECKING
+from . import bool
from . import date
from . import json
+from . import none
from . import text
from . import uuid
from . import array
from . import network
from . import numeric
from . import composite
-from . import singletons
from .._typeinfo import TypeInfo as TypeInfo # exported here
def register_default_globals(ctx: "AdaptContext") -> None:
+ bool.register_default_globals(ctx)
date.register_default_globals(ctx)
json.register_default_globals(ctx)
+ none.register_default_globals(ctx)
text.register_default_globals(ctx)
uuid.register_default_globals(ctx)
array.register_default_globals(ctx)
network.register_default_globals(ctx)
numeric.register_default_globals(ctx)
composite.register_default_globals(ctx)
- singletons.register_default_globals(ctx)
# Must come after all the types are registered
array.register_all_arrays(ctx)
"""
-Adapters for None and boolean.
+Adapters for booleans.
"""
# Copyright (C) 2020-2021 The Psycopg Team
return b"\x01" if obj else b"\x00"
-class NoneDumper(Dumper):
- """
- Not a complete dumper as it doesn't implement dump(), but it implements
- quote(), so it can be used in sql composition.
- """
-
- format = Format.TEXT
-
- def dump(self, obj: None) -> bytes:
- raise NotImplementedError("NULL is passed to Postgres in other ways")
-
- def quote(self, obj: None) -> bytes:
- return b"NULL"
-
-
class BoolLoader(Loader):
format = Format.TEXT
def register_default_globals(ctx: AdaptContext) -> None:
BoolDumper.register(bool, ctx)
BoolBinaryDumper.register(bool, ctx)
- NoneDumper.register(type(None), ctx)
BoolLoader.register("bool", ctx)
BoolBinaryLoader.register("bool", ctx)
--- /dev/null
+"""
+Adapters for None.
+"""
+
+# Copyright (C) 2020-2021 The Psycopg Team
+
+from ..pq import Format
+from ..adapt import Dumper
+from ..proto import AdaptContext
+
+
+class NoneDumper(Dumper):
+ """
+ Not a complete dumper as it doesn't implement dump(), but it implements
+ quote(), so it can be used in sql composition.
+ """
+
+ format = Format.TEXT
+
+ def dump(self, obj: None) -> bytes:
+ raise NotImplementedError("NULL is passed to Postgres in other ways")
+
+ def quote(self, obj: None) -> bytes:
+ return b"NULL"
+
+
+def register_default_globals(ctx: AdaptContext) -> None:
+ NoneDumper.register(type(None), ctx)
include "types/date.pyx"
include "types/numeric.pyx"
-include "types/singletons.pyx"
+include "types/bool.pyx"
include "types/text.pyx"
--- /dev/null
+from psycopg3 import sql
+from psycopg3.adapt import Transformer, Format
+
+
+def test_quote_none(conn):
+
+ tx = Transformer()
+ assert tx.get_dumper(None, Format.TEXT).quote(None) == b"NULL"
+
+ cur = conn.cursor()
+ cur.execute(sql.SQL("select {v}").format(v=sql.Literal(None)))
+ assert cur.fetchone()[0] is None