@@ -105,12 +105,18 @@ class StrDumperUnknown(_StrDumper):
105105
106106
107107class TextLoader (Loader ):
108+ # 是否将空字符串视为 None(GaussDB 兼容模式)
109+ _empty_as_none : bool = False
110+
108111 def __init__ (self , oid : int , context : AdaptContext | None = None ):
109112 super ().__init__ (oid , context )
110113 enc = conn_encoding (self .connection )
111114 self ._encoding = enc if enc != "ascii" else ""
112115
113- def load (self , data : Buffer ) -> bytes | str :
116+ def load (self , data : Buffer ) -> bytes | str | None :
117+ if not data :
118+ # GaussDB 可能返回空 bytes 表示空字符串
119+ return None if self ._empty_as_none else ""
114120 if self ._encoding :
115121 if isinstance (data , memoryview ):
116122 data = bytes (data )
@@ -175,14 +181,18 @@ def dump(self, obj: Buffer) -> Buffer | None:
175181
176182class ByteaLoader (Loader ):
177183 _escaping : EscapingProto
184+ _empty_as_none : bool = False
178185
179186 def __init__ (self , oid : int , context : AdaptContext | None = None ):
180187 super ().__init__ (oid , context )
181188 if not hasattr (self .__class__ , "_escaping" ):
182189 self .__class__ ._escaping = Escaping ()
183190
184- def load (self , data : Buffer ) -> bytes :
185- return self ._escaping .unescape_bytea (data )
191+ def load (self , data : Buffer ) -> bytes | None :
192+ result = self ._escaping .unescape_bytea (data )
193+ if not result and self ._empty_as_none :
194+ return None
195+ return result
186196
187197
188198class ByteaBinaryLoader (Loader ):
0 commit comments