MagicStack / MagicStack/asyncpg
no binary format encoder for type jsonb
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
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Ö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