MagicStack / MagicStack/asyncpg

no binary format encoder for type jsonb

Offen
#1,144 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Python
Sterne
8.1k
Forks
468
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

  • asyncpg version: 0.29.0

  • PostgreSQL version: 16

  • Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
    the issue with a local PostgreSQL install?
    :

  • Python version: 3.11

  • Platform: 5.10.0-21-arm64 #1 SMP Debian 5.10.162-1 (2023-01-21) aarch64 GNU/Linux

  • Do you use pgbouncer?:no

  • Did you install asyncpg with pip?: yes

  • If you built asyncpg locally, which version of Cython did you use?:

  • Can the issue be reproduced under both asyncio and
    uvloop?
    : yes

,asyncpg.exceptions._base.InternalClientError: no binary format encoder for type jsonb (OID 3802)

async def insert_binary(self, table, rows):
	if rows:
		rows = common_function.convert_data_type(rows, decimal.Decimal, float, )
		columms = rows[0].keys()
		data = []
		for row_index, rows_once in enumerate(rows):
			data_once = [rows_once[columns_once] for columns_once in columms]
			data.append(tuple(data_once))
		conn = await self.connect()
		await conn.copy_records_to_table(table,records=data, columns=rows[0].keys())
		await conn.fetch('SELECT 1')
		await conn.close()

I've tried various methods, but I couldn't manage to insert binary data. I've tried using decoders and other approaches. It seems like it needs a binary decoder, not a text one, but I haven't figured out how to represent it in binary. I'd appreciate any help.


await conn.set_type_codec(
	"jsonb",
	encoder=lambda data: b"\x01" + common_function.decoder.dumps(data, False),
	decoder=lambda data: common_function.decoder.loads(data[1:]),
	schema="pg_catalog",
	format="binary"
)
await conn.set_type_codec(
	'numeric'
	, encoder = lambda f: str(f).encode('utf8')
	, decoder = lambda b: b.decode('utf8')
	, schema='pg_catalog'
	, format='binary'
)


"This also doesn't work."

"I replaced 'numeric' with 'float' (database field types), and the problem 'no binary format encoder for type numeric' disappeared. However, I couldn't figure out which format decoder is needed for JSON."

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginnen Sie mit copy_records_to_table und set_type_codec und reproduzieren Sie den gemeldeten Fehler für PostgreSQL jsonb (OID 3802) mit binary format. Verfolgen Sie anschließend die bestehende Verarbeitung von JSON- und numerischen Codecs und überprüfen Sie dann, dass Datensätze im binary format für jsonb ohne den gemeldeten Encoder-Fehler akzeptiert werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
postgresql, python
Bereich
databases
Issue-Typ
Feature
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
30/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.