[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81765":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":11,"openIssues":12,"contributorsCount":13,"subscribersCount":13,"size":13,"stars1d":13,"stars7d":13,"stars30d":13,"stars90d":13,"forks30d":13,"starsTrendScore":13,"compositeScore":14,"rankGlobal":9,"rankLanguage":9,"license":15,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":16,"hasPages":16,"topics":18,"createdAt":9,"pushedAt":9,"updatedAt":19,"readmeContent":20,"aiSummary":21,"trendingCount":13,"starSnapshotCount":13,"syncStatus":22,"lastSyncTime":23,"discoverSource":24},81765,"adbc-driver-quack","gizmodata\u002Fadbc-driver-quack","gizmodata","Go ADBC driver for DuckDB's Quack remote protocol (quack:\u002F\u002F URI scheme). Returns Apache Arrow RecordBatches; supports bulk-ingest via APPEND_REQUEST. Distributed as a Go module + pip-installable Python wheel.",null,"Go",23,1,0,0.9,"Other",false,"main",[],"2026-06-12 02:04:19","# adbc-driver-quack\n\n**An [Apache Arrow ADBC](https:\u002F\u002Farrow.apache.org\u002Fadbc\u002F) driver for [DuckDB's Quack remote protocol](https:\u002F\u002Fduckdb.org\u002Fdocs\u002Fcurrent\u002Fquack\u002Foverview).**\n\n[![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fadbc-driver-quack?label=PyPI&logo=pypi&logoColor=white&color=blue)](https:\u002F\u002Fpypi.org\u002Fproject\u002Fadbc-driver-quack\u002F)\n[![PyPI downloads](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fdm\u002Fadbc-driver-quack?label=downloads&logo=pypi&logoColor=white)](https:\u002F\u002Fpypistats.org\u002Fpackages\u002Fadbc-driver-quack)\n[![Python versions](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fpyversions\u002Fadbc-driver-quack?label=Python&logo=python&logoColor=white)](https:\u002F\u002Fpypi.org\u002Fproject\u002Fadbc-driver-quack\u002F)\n[![Go module](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Ftag\u002Fgizmodata\u002Fadbc-driver-quack?label=Go%20module&logo=go&logoColor=white&sort=semver)](https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fgizmodata\u002Fadbc-driver-quack)\n[![CI](https:\u002F\u002Fgithub.com\u002Fgizmodata\u002Fadbc-driver-quack\u002Factions\u002Fworkflows\u002Fpython.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fgizmodata\u002Fadbc-driver-quack\u002Factions\u002Fworkflows\u002Fpython.yml)\n[![GitHub Repo](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fgithub-gizmodata%2Fadbc--driver--quack-181717?logo=github)](https:\u002F\u002Fgithub.com\u002Fgizmodata\u002Fadbc-driver-quack)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](LICENSE)\n\nReturns Apache Arrow `RecordBatch`es directly from a remote DuckDB server\nspeaking Quack. Supports the standard ADBC bulk-ingest path\n(`Statement.BindStream` → `APPEND_REQUEST`) for fast column-oriented loads.\n\nDistributed as:\n- a Go module — `github.com\u002Fgizmodata\u002Fadbc-driver-quack`\n- a `pip install adbc-driver-quack` wheel for Python (macOS \u002F Linux \u002F Windows × x64 \u002F arm64)\n\n> **Status:** Alpha — `v0.1.0-alpha.1` is the first release. The companion\n> [`gizmodata\u002Fquack-jdbc`](https:\u002F\u002Fgithub.com\u002Fgizmodata\u002Fquack-jdbc) JDBC\n> driver is the same protocol from the JVM and is at\n> [v0.1.0-alpha.1 on Maven Central](https:\u002F\u002Fcentral.sonatype.com\u002Fartifact\u002Fcom.gizmodata\u002Fquack-jdbc\u002F0.1.0-alpha.1).\n\n## Quickstart\n\n### 1. Start a Quack server (any DuckDB v1.5.3+)\n\n```sql\n-- in any DuckDB session — Quack is a core extension as of v1.5.3,\n-- so no `core_nightly` repository or `-unsigned` flag is needed.\nINSTALL quack;\nLOAD quack;\nCALL quack_serve('quack:localhost:9494', token=>'my-secret-token');\n```\n\nThe server stays running until the DuckDB session exits. Press Ctrl-C in\nthe DuckDB REPL to stop it.\n\n> **Note**: `quack_serve` accepts shorter forms — `'quack:localhost'`\n> uses the default port, and a bare `quack_serve()` with no first arg\n> uses `localhost` as the host. We keep the explicit `localhost:9494`\n> form throughout this README so the client-side URI maps obviously to\n> what the server is bound to.\n>\n> If `localhost` ever gives you a `connection refused` (rare, but it can\n> happen on a system whose `\u002Fetc\u002Fhosts` is set up such that the server\n> binds one address family and the client dials the other), use\n> `127.0.0.1` on *both* sides.\n\n### 2. Install the driver\n\n**Python:**\n\n```bash\npip install adbc-driver-quack\n```\n\n**Go:**\n\n```bash\ngo get github.com\u002Fgizmodata\u002Fadbc-driver-quack@latest\n```\n\n### 3. Connect and query\n\n```python\nimport adbc_driver_quack.dbapi as quack\nimport pyarrow\n\nwith quack.connect(\n    uri=\"quack:\u002F\u002Flocalhost:9494\",\n    db_kwargs={\"adbc.quack.token\": \"my-secret-token\"},\n) as conn, conn.cursor() as cur:\n    cur.execute(\"SELECT 42 AS answer, 'hello duckdb' AS greeting\")\n    table: pyarrow.Table = cur.fetch_arrow_table()\n    print(table)\n```\n\nThe result is a real `pyarrow.Table` — pass it straight to Polars, Pandas,\nDuckDB-in-process, ibis, or anything else that consumes Arrow:\n\n```python\nimport polars as pl\ndf = pl.from_arrow(table)\n```\n\n#### Alternative: drive `adbc_driver_manager` directly\n\nIf you prefer the [adbc-quickstarts](https:\u002F\u002Fgithub.com\u002Fcolumnar-tech\u002Fadbc-quickstarts)\nidiom — passing the driver to `adbc_driver_manager.dbapi.connect` rather\nthan going through our wrapper — point at the bundled shared library via\n`_driver_path()`:\n\n```python\nfrom adbc_driver_manager import dbapi\nimport adbc_driver_quack\n\nwith dbapi.connect(\n    driver=adbc_driver_quack._driver_path(),\n    entrypoint=\"QuackDriverInit\",\n    db_kwargs={\n        \"uri\": \"quack:\u002F\u002Flocalhost:9494\",\n        \"adbc.quack.token\": \"my-secret-token\",\n    },\n) as conn, conn.cursor() as cur:\n    cur.execute(\"SELECT 42 AS answer\")\n    table = cur.fetch_arrow_table()\n```\n\nBoth styles work the same on the wire — pick whichever reads better for\nyour codebase.\n\n### Streaming large result sets\n\n`Cursor.fetch_record_batch()` returns a `pyarrow.RecordBatchReader` that\npulls one server-side `DataChunk` per `read_next_batch()` call. Memory\nstays bounded by the server's chunk size (~2k rows) even when the result\nis millions of rows:\n\n```python\nwith conn.cursor() as cur:\n    cur.execute(\"SELECT * FROM lineitem\")  # arbitrary size\n    reader = cur.fetch_record_batch()\n    for batch in reader:\n        process(batch)  # one ~2k-row Arrow batch at a time\n```\n\n### Bulk ingest (Arrow → DuckDB)\n\n```python\nimport pyarrow as pa\nimport adbc_driver_quack.dbapi as quack\n\ntable = pa.table({\"id\": [1, 2, 3], \"name\": [\"alice\", \"bob\", \"carol\"]})\nwith quack.connect(\n    uri=\"quack:\u002F\u002Flocalhost:9494\",\n    db_kwargs={\"adbc.quack.token\": \"my-secret-token\"},\n    autocommit=True,  # ADBC connections are autocommit-OFF by default;\n                      # opt in here so the ingest persists on close\n) as conn, conn.cursor() as cur:\n    # create_append: create \"customers\" from the Arrow schema if it\n    # doesn't exist, then append. One APPEND_REQUEST per RecordBatch.\n    cur.adbc_ingest(table_name=\"customers\", data=table, mode=\"create_append\")\n```\n\n> **Heads-up — autocommit is off by default.** Per the Python DB-API,\n> `quack.connect()` opens connections inside a transaction. Without the\n> `autocommit=True` above (or an explicit `conn.commit()`), the\n> `CREATE` + append run in a transaction that is **rolled back when the\n> connection closes** — `adbc_ingest` still returns the row count it\n> sent, but nothing persists. Prefer explicit transactions? Drop\n> `autocommit=True` and call `conn.commit()` after `adbc_ingest()`:\n>\n> ```python\n> with quack.connect(uri=\"quack:\u002F\u002Flocalhost:9494\",\n>                     db_kwargs={\"adbc.quack.token\": \"my-secret-token\"}) as conn, conn.cursor() as cur:\n>     cur.adbc_ingest(table_name=\"customers\", data=table, mode=\"create_append\")\n>     conn.commit()  # without this, the ingest is rolled back on close\n> ```\n\n`mode` accepts the four standard ADBC ingest modes:\n\n| mode            | behavior                                                  |\n|-----------------|-----------------------------------------------------------|\n| `create`        | create the table (errors if it already exists), then append — this is the default when `mode` is omitted |\n| `append`        | append to an existing table (no DDL; errors if missing)   |\n| `replace`       | `CREATE OR REPLACE` the table, then append                |\n| `create_append` | create the table if it doesn't exist, then append         |\n\nTable DDL for the create-family modes is generated from the Arrow\nschema. Pass `db_schema_name=...` to target a non-default schema.\n\n### Transactions (autocommit off)\n\n```python\nimport adbc_driver_quack.dbapi as quack\n\nwith quack.connect(\n    uri=\"quack:\u002F\u002Flocalhost:9494\",\n    db_kwargs={\"adbc.quack.token\": \"...\"},\n    autocommit=False,\n) as conn, conn.cursor() as cur:\n    cur.execute(\"INSERT INTO orders VALUES (1, 'pending')\")\n    cur.execute(\"INSERT INTO order_items VALUES (1, 'widget', 2)\")\n    conn.commit()  # both inserts persist atomically\n```\n\n## Connection URL\n\n```\nquack:\u002F\u002Fhost[:port]\n```\n\n| Option              | Default | Notes                                                                    |\n|---------------------|---------|--------------------------------------------------------------------------|\n| `adbc.uri`          | —       | Required. Pass as the `uri=` kwarg to `quack.connect`.                   |\n| `adbc.quack.token`  | (none)  | Authentication token. Server-side `token=>` argument to `quack_serve()`. |\n| `adbc.quack.tls`    | `false` | `true` → use `https:\u002F\u002F` for the underlying HTTP transport.               |\n\nThe URI is its own kwarg; everything else goes through `db_kwargs`:\n\n```python\nimport adbc_driver_quack.dbapi as quack\n\nquack.connect(\n    uri=\"quack:\u002F\u002Flocalhost:9494\",\n    db_kwargs={\n        \"adbc.quack.token\": \"my-secret-token\",\n        \"adbc.quack.tls\": \"false\",\n    },\n)\n```\n\n## Why ADBC and not JDBC?\n\nBoth drivers speak the same protocol to the same kind of server. Pick the\none that fits your runtime:\n\n| You're using | Reach for |\n|---|---|\n| A JVM tool (DBeaver, IntelliJ, Spark, dbt-jdbc, plain `java.sql`) | [`quack-jdbc`](https:\u002F\u002Fgithub.com\u002Fgizmodata\u002Fquack-jdbc) |\n| Python (`pip install`), Go, Rust, R, anything via ADBC C ABI | this driver |\n| You want **zero-copy Arrow data** end-to-end | this driver |\n\n## Repo layout\n\n```\nadbc-driver-quack\u002F\n├── go.mod, go.sum\n├── internal\u002F\n│   ├── codec\u002F       — BinaryReader\u002FWriter for DuckDB BinarySerializer\n│   ├── quacktype\u002F   — Logical \u002F physical \u002F extra type system + codec\n│   ├── message\u002F     — DataChunk, DecodedVector, MessageCodec, VectorCodec\n│   └── transport\u002F   — QuackURI parser + net\u002Fhttp transport (IPv4\u002FIPv6 fallback)\n├── driver\u002Fquack\u002F    — pure-Go ADBC Driver\u002FDatabase\u002FConnection\u002FStatement impl\n├── pkg\u002Fquack\u002F       — cgo c-shared wrapper (produces libadbc_driver_quack.{so,dylib,dll})\n├── python\u002F          — Python wheel sources (adbc_driver_quack)\n└── .github\u002F         — CI: go test, python tests, cibuildwheel matrix, PyPI publish\n```\n\nThe `internal\u002F` layer is a clean-room Go port of the matching Java\npackages in [`quack-jdbc`](https:\u002F\u002Fgithub.com\u002Fgizmodata\u002Fquack-jdbc).\n\n## Credits\n\n- Wire format: [DuckDB Quack protocol](https:\u002F\u002Fduckdb.org\u002Fdocs\u002Fcurrent\u002Fquack\u002Foverview)\n- Codec design: ported from\n  [`gizmodata\u002Fquack-jdbc`](https:\u002F\u002Fgithub.com\u002Fgizmodata\u002Fquack-jdbc) (MIT),\n  which itself was clean-room ported from\n  [`tobilg\u002Fquack-protocol`](https:\u002F\u002Fgithub.com\u002Ftobilg\u002Fquack-protocol) (MIT)\n- ADBC framework: [Apache Arrow ADBC](https:\u002F\u002Fgithub.com\u002Fapache\u002Farrow-adbc) (Apache-2.0)\n\n## License\n\n[MIT](https:\u002F\u002Fgithub.com\u002Fgizmodata\u002Fadbc-driver-quack\u002Fblob\u002Fmain\u002FLICENSE) — see `LICENSE` for full attribution.\n","adbc-driver-quack 是一个用于 DuckDB 的 Quack 远程协议的 Apache Arrow ADBC 驱动程序。该项目支持通过 quack:\u002F\u002F URI 方案与远程 DuckDB 服务器通信，并能够直接返回 Apache Arrow RecordBatches，同时支持通过 APPEND_REQUEST 实现高效的大批量数据导入。此驱动程序以 Go 模块和 Python 包的形式提供，方便在多种平台上集成使用。适用于需要高性能数据处理及分析的应用场景，尤其是在已有 DuckDB 环境下希望利用其强大功能进行分布式或远程数据操作的情况。",2,"2026-06-11 04:06:19","CREATED_QUERY"]