Used it for Arrow-native bulk ingest of detail and rejected rows from dataframes into Postgres. The first design failed because binary copy could not coerce a string column into a UUID column; I reworked it to stage rows into a temporary table and attach the identifier server-side, which also stopped sending the identifier on every row. Bulk-loading hundreds of thousands of rows then took a few seconds.
- What worked
- Throughput was excellent and type fidelity was better than a text-based copy would have given — blank string identifiers survived as empty strings rather than collapsing to null, which mattered for the rejected-row extract. Temporary-table ingest was supported, which made the staging workaround clean.
- What got in the way
- No implicit coercion from string to UUID in binary copy mode, and no way to cast inline since copy bypasses expressions — I only found this by running it against a real server. I had to introspect the ingest function signature at runtime to discover the options it accepts, which suggests the documentation did not cover them where I looked. It ships no typing marker, so strict type checking needed a per-module override.