adbc-driver-spanner
A Python ADBC driver for Google Cloud Spanner.
Query Spanner through a standard DBAPI 2.0 connection and get results back as Apache Arrow — ready to hand straight to pandas, polars, DuckDB, or PyArrow with no per-row Python conversion.
Install
pip install adbc-driver-spanner
# For the DataFrame / Arrow helpers (fetch_df, fetch_arrow_table, adbc_ingest, …):
pip install "adbc-driver-spanner[dbapi]" pandas
The wheels ship a prebuilt native library, so there is nothing to compile. Prebuilt wheels are published for Linux (x86-64 glibc + aarch64 glibc, plus x86-64 and aarch64 musl for Alpine), macOS (arm64, x86-64), and Windows (x86-64, arm64) — see Supported platforms for the minimum OS / libc each one requires.
Quickstart
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import DatabaseOptions
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/my-project/instances/my-instance/databases/my-db"},
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT SingerId, FirstName FROM Singers")
df = cur.fetch_df() # -> pandas.DataFrame
connect() returns an ordinary DBAPI connection: use cur.execute(...) with ?/@name
parameters, cur.fetchone() / cur.fetchall(), conn.commit(), and so on. The fetch_*
helpers below add zero-copy Arrow output on top.
Authentication
By default the driver uses Application Default Credentials
(ADC) — the same credentials gcloud auth application-default login and Google Cloud runtimes
provide. To use a service-account key instead, pass its path or its JSON as a raw option in
db_kwargs:
# docs-test: skip
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import DatabaseOptions
spanner.connect(db_kwargs={
DatabaseOptions.URI.value: "spanner:///projects/p/instances/i/databases/d",
DatabaseOptions.KEYFILE.value: "/path/to/service-account.json",
})
To impersonate another service account on top of your base credentials, set
DatabaseOptions.IMPERSONATE_TARGET_PRINCIPAL:
# docs-test: skip
spanner.connect(db_kwargs={
DatabaseOptions.URI.value: "spanner:///projects/p/instances/i/databases/d",
DatabaseOptions.IMPERSONATE_TARGET_PRINCIPAL.value: "target@p.iam.gserviceaccount.com",
DatabaseOptions.IMPERSONATE_SCOPES.value: "https://www.googleapis.com/auth/cloud-platform",
})
Set DatabaseOptions.ACCESS_TOKEN to authenticate with an OAuth 2.0 bearer token you already hold
(for example from gcloud auth print-access-token). It is sent verbatim with no refresh, and is
mutually exclusive with DatabaseOptions.KEYFILE / DatabaseOptions.KEYFILE_JSON /
DatabaseOptions.IMPERSONATE_TARGET_PRINCIPAL:
# docs-test: skip
spanner.connect(db_kwargs={
DatabaseOptions.URI.value: "spanner:///projects/p/instances/i/databases/d",
DatabaseOptions.ACCESS_TOKEN.value: "ya29.a0Af...",
})
To talk to the Spanner emulator, point at its
endpoint and set DatabaseOptions.EMULATOR to "true" (which connects with anonymous credentials):
# docs-test: skip
spanner.connect(db_kwargs={
DatabaseOptions.URI.value: "spanner:///projects/p/instances/i/databases/d",
DatabaseOptions.ENDPOINT.value: "localhost:9010",
DatabaseOptions.EMULATOR.value: "true",
})
Connection options
connect() takes just three keyword arguments — every driver setting travels as an option key,
best spelled with the DatabaseOptions / ConnectionOptions / StatementOptions constants (see
Typed option keys):
| kwarg | Description |
|---|---|
db_kwargs= |
Database-level options, keyed with the DatabaseOptions constants (credentials, emulator, endpoint, …). See the table below. |
conn_kwargs= |
Connection-level options, keyed with the ConnectionOptions constants (adbc.connection.* / spanner.*), e.g. ConnectionOptions.READONLY. |
autocommit= |
False (the DBAPI default) groups statements into manual transactions (queries or DML — one kind each; DDL always applies immediately); True applies each immediately — see Transactions. |
A database URI is required; everything else is optional. The database-level credential and endpoint options are:
DatabaseOptions member |
Raw key | Description |
|---|---|---|
URI |
uri |
A spanner:// connection URI whose path is the database path, e.g. spanner:///projects/<p>/instances/<i>/databases/<d> (required). The scheme is required; a bare path is rejected. Query parameters may name database options, but not the secret-holding KEYFILE_JSON / ACCESS_TOKEN (URIs get logged). |
ENDPOINT |
spanner.endpoint |
Explicit gRPC endpoint (e.g. an emulator at localhost:9010); defaults to production Spanner. |
EMULATOR |
spanner.emulator |
"true" to connect with anonymous credentials for the emulator. |
KEYFILE |
spanner.auth.keyfile |
Path to a service-account / credential JSON file (default: Application Default Credentials). |
KEYFILE_JSON |
spanner.auth.keyfile_json |
The same credential JSON passed inline as a string instead of a file path. Write-only: never readable back via get_option, and not accepted as a URI query parameter — pass it here instead. |
ACCESS_TOKEN |
spanner.auth.access_token |
OAuth 2.0 bearer token sent verbatim (no refresh); mutually exclusive with the keyfile / impersonation options. Write-only: never readable back via get_option, and not accepted as a URI query parameter — pass it here instead. |
IMPERSONATE_TARGET_PRINCIPAL |
spanner.auth.impersonate.target_principal |
Service account to impersonate on top of the base credentials. |
IMPERSONATE_DELEGATES |
spanner.auth.impersonate.delegates |
Delegation chain for impersonation — a comma-separated string of emails. |
IMPERSONATE_SCOPES |
spanner.auth.impersonate.scopes |
OAuth scopes for the impersonated token (comma-separated; default cloud-platform). |
IMPERSONATE_LIFETIME |
spanner.auth.impersonate.lifetime |
Lifetime of the impersonated token, in seconds (default 3600). |
Every other setting is passed the same way — via db_kwargs= (database-level), conn_kwargs=
(connection-level), or per cursor with conn.cursor(adbc_stmt_kwargs={...}). The complete,
authoritative list — every option with its type, default, and behaviour — is in
docs/options.md. A few that
are handy from Python:
ConnectionOptions / StatementOptions member |
Raw key | Level | Description |
|---|---|---|---|
ConnectionOptions.READONLY |
adbc.connection.readonly |
connection | "true" rejects all writes on the connection (see below); queries still run. |
READ_STALENESS |
spanner.read.staleness |
conn/stmt | Serve reads from a bounded-stale snapshot, e.g. "max:10s" or "exact:5s", for lower latency. |
DIRECTED_READ |
spanner.directed_read |
conn/stmt | Steer read-only queries to specific replicas, e.g. "include:us-east1:read_only" or "exclude:us-central1". |
MAX_COMMIT_DELAY |
spanner.commit.max_delay |
conn/stmt | Max delay Spanner may add to a read/write commit to batch it with others, e.g. "100ms" (a duration in 0..=500ms) — trades a little latency for throughput. |
COMMIT_STATS |
spanner.commit_stats |
conn/stmt | "true" requests commit statistics on read/write commits; read the mutation count of the most recent commit back with get_option_int("spanner.commit_stats.mutation_count") (on the statement for autocommit DML / bulk ingest, on the connection for a manual-mode commit). |
QUERY_OPTIMIZER_VERSION |
spanner.query.optimizer_version |
conn/stmt | Pin the query optimizer version, e.g. "6" or "latest" (also QUERY_OPTIMIZER_STATISTICS_PACKAGE). |
StatementOptions.ROWS_PER_BATCH |
spanner.rows_per_batch |
statement | Rows per streamed Arrow batch (default 8192); lower it to cap peak memory. |
Typed option keys
The DatabaseOptions, ConnectionOptions, and StatementOptions enums (each member's .value is
the raw key) are the recommended way to name options — for typo-safety and discoverability, the same
style as the BigQuery ADBC driver's DatabaseOptions:
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import ConnectionOptions, DatabaseOptions, StatementOptions
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/p/instances/i/databases/d"},
conn_kwargs={ConnectionOptions.READ_STALENESS.value: "max:10s"},
autocommit=True, # one-shot reads: bounded staleness lets Spanner pick the freshest replica
) as conn:
cur = conn.cursor(
adbc_stmt_kwargs={StatementOptions.ROWS_PER_BATCH.value: "1024"}
)
cur.execute("SELECT * FROM Singers")
(In the default manual-transaction mode, queries share one multi-use read-only transaction — see
Transactions — and Spanner accepts the bounded-staleness kinds only on single-use
reads, so a max:<d>/min:<t> bound is pinned there to its most-stale legal equivalent: exact
staleness <d> / read timestamp <t>.)
The enums cover the full option surface for the db_kwargs= / conn_kwargs= /
adbc_stmt_kwargs= escape hatches. Every key is documented in
docs/options.md.
Read-only connections
Pass conn_kwargs={ConnectionOptions.READONLY.value: "true"} to guarantee a connection can only
read — any INSERT/UPDATE/DELETE, DDL, or bulk ingest raises, while queries still run:
# docs-test: skip
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import ConnectionOptions, DatabaseOptions
with spanner.connect(db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/p/instances/i/databases/d"},
conn_kwargs={ConnectionOptions.READONLY.value: "true"}) as conn:
conn.cursor().execute("SELECT 1") # ok
# any INSERT/UPDATE/DELETE, DDL or adbc_ingest raises
The guarantee also covers conn.commit(): in the default manual-transaction mode DML buffers
until commit (see Transactions), so a connection turned read-only after some
DML was buffered raises ProgrammingError on conn.commit() — and on switching the connection to
autocommit, which commits pending work — instead of writing. The transaction stays open and
replayable: clear
the flag and commit again to apply it, or conn.rollback() (never gated — discarding buffered work
writes nothing) to discard it. Committing a query transaction is likewise always allowed.
Smaller result batches
Results stream back as Arrow record batches. Lower spanner.rows_per_batch on the cursor to cap
peak memory on a wide or large result:
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import DatabaseOptions, StatementOptions
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/my-project/instances/my-instance/databases/my-db"},
) as conn:
with conn.cursor() as cur:
cur.adbc_statement.set_options(**{StatementOptions.ROWS_PER_BATCH.value: "1024"})
cur.execute("SELECT SingerId, FirstName FROM Singers")
reader = cur.fetch_record_batch() # batches of <= 1024 rows
table = reader.read_all()
Transactions
A DBAPI connection is autocommit-off by default, so statements run in manual transactions
ended by conn.commit() (or discarded by conn.rollback()). A manual transaction is exactly one
kind of work — queries or DML — fixed by its first statement; a statement of the other kind
raises adbc_driver_manager.ProgrammingError (ADBC InvalidState) until you commit or roll back:
- Queries share one snapshot. The first query opens a Spanner multi-use read-only
transaction, and every query until
commit()/rollback()reads from that same consistent snapshot — rows committed by others in the meantime stay invisible. Ending a query transaction is free (Spanner read-only transactions need no commit RPC), so commit or roll back as soon as you no longer need the snapshot. - DML is buffered — no read-your-writes.
INSERT/UPDATE/DELETE(and bulk ingest) buffer and apply atomically onconn.commit(). A query inside a DML transaction could not see the buffered writes, so it is rejected rather than silently returning a stale (pre-insert) result. - DDL is not transaction-aware.
CREATE/ALTER/DROPalways apply immediately (Spanner DDL runs through the admin API and is never transactional — the same no-special-handling approach as the ADBC BigQuery driver), regardless of the transaction:commit()is not needed androllback()cannot undo them, and DDL issued after buffered DML executes before it. A;-separated DDL batch still applies as oneUpdateDatabaseDdlcall.
Connect with autocommit=True if you want every statement to apply immediately.
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_manager import ProgrammingError
from adbc_driver_spanner import DatabaseOptions
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/my-project/instances/my-instance/databases/my-db"},
) as conn: # DBAPI default: autocommit off => manual transactions
with conn.cursor() as cur:
# DDL applies immediately — no commit needed, and rollback cannot undo it.
cur.execute("DROP TABLE IF EXISTS Albums")
cur.execute("CREATE TABLE Albums (Id INT64 NOT NULL) PRIMARY KEY (Id)")
cur.execute("INSERT INTO Albums (Id) VALUES (1)") # a DML transaction: buffered
# Querying while the INSERT is buffered is rejected (no read-your-writes) instead of
# silently returning a stale count.
try:
cur.execute("SELECT COUNT(*) FROM Albums")
raise AssertionError("expected the guarded query to raise")
except ProgrammingError:
pass # commit (or roll back) first to see the write
conn.commit() # the buffered INSERT is applied here, atomically
with conn.cursor() as cur:
cur.execute("SELECT COUNT(*) FROM Albums") # a query transaction: pins a snapshot
assert cur.fetchone()[0] == 1 # visible only after the DML commit
conn.rollback() # ends the query transaction (its snapshot) without a round-trip
Working with DataFrames
Results come back as Apache Arrow, so they flow into the popular DataFrame libraries without a
per-row conversion. The DataFrame / Arrow paths need the [dbapi] extra (which pulls in PyArrow).
Remember that writes need conn.commit() unless you connect with autocommit=True.
All examples assume a Singers(SingerId INT64, FirstName STRING) table.
pandas:
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import DatabaseOptions
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/my-project/instances/my-instance/databases/my-db"},
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT SingerId, FirstName FROM Singers ORDER BY SingerId")
df = cur.fetch_df() # -> pandas.DataFrame
pyarrow — results as a native Arrow table:
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import DatabaseOptions
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/my-project/instances/my-instance/databases/my-db"},
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT SingerId, FirstName FROM Singers ORDER BY SingerId")
table = cur.fetch_arrow_table() # -> pyarrow.Table
polars — read straight from the connection:
import polars as pl
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import DatabaseOptions
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/my-project/instances/my-instance/databases/my-db"},
) as conn:
df = pl.read_database(
"SELECT SingerId, FirstName FROM Singers ORDER BY SingerId",
connection=conn, # an ADBC connection, not a URI
)
DuckDB — query the fetched Arrow table in-process:
import duckdb
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import DatabaseOptions
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/my-project/instances/my-instance/databases/my-db"},
) as conn:
with conn.cursor() as cur:
cur.execute("SELECT SingerId, FirstName FROM Singers")
singers = cur.fetch_arrow_table()
# `singers` is a pyarrow.Table; DuckDB queries it by variable name, no copy.
top = duckdb.sql("SELECT COUNT(*) AS n, MIN(FirstName) AS first FROM singers").fetchone()
Bulk insert a DataFrame
cur.adbc_ingest(table, data, mode=...) inserts an Arrow table (or anything Arrow-convertible, like
a pandas DataFrame) in bulk, without writing SQL:
import pandas as pd
import pyarrow as pa
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import DatabaseOptions
frame = pd.DataFrame({"SingerId": [10, 11], "FirstName": ["Carol", "Dave"]})
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/my-project/instances/my-instance/databases/my-db"},
autocommit=True, # apply immediately; returns the row count
) as conn:
with conn.cursor() as cur:
# `append` inserts into an existing table (the default mode is `create`).
rows = cur.adbc_ingest("Singers", pa.Table.from_pandas(frame), mode="append")
The mode selects how the target table is handled:
create— create the table from the data's Arrow schema first, erroring if it already exists (the default).append— insert into an existing table.create_append— create the table only if it is absent, then insert.replace— drop any existing table, recreate it from the schema, then insert.
Spanner requires a primary key on every table, but an ingested Arrow batch has none, so the three
create modes add a synthetic adbc_ingest_key column (a UUID string) as the primary key. It is not
part of your data, but it is a real column and will show up in SELECT *.
Partitioned reads and Data Boost
A large scan can be split into independent partitions and read in parallel — optionally on Spanner's
serverless Data Boost compute, so the work is isolated from your provisioned instance. This uses
the ADBC partitioned-execution extension (adbc_execute_partitions / adbc_read_partition):
import adbc_driver_spanner.dbapi as spanner
from adbc_driver_spanner import DatabaseOptions, StatementOptions
with spanner.connect(
db_kwargs={DatabaseOptions.URI.value: "spanner:///projects/my-project/instances/my-instance/databases/my-db"},
) as conn:
with conn.cursor() as cur:
# Optional statement options, set on the underlying ADBC statement:
cur.adbc_statement.set_options(**{
StatementOptions.DATA_BOOST.value: "true", # run on Data Boost
StatementOptions.MAX_PARTITIONS.value: "8", # cap the partition count
})
partitions, schema = cur.adbc_execute_partitions("SELECT SingerId FROM Singers")
# Each descriptor is opaque bytes; it can be shipped to another worker,
# process, or connection and read independently.
for token in partitions:
with conn.cursor() as cur:
cur.adbc_read_partition(token)
table = cur.fetch_arrow_table()
...
Only single-table scans are partitionable — queries with an ORDER BY or aggregation are not.
A descriptor is opaque but executable: it carries the SQL text plus the session and transaction
identity, so adbc_read_partition runs whatever it contains with the connection's credentials, and
it is not authenticated. Ship descriptors only over trusted channels, and never read one from an
untrusted source.
Supported platforms
Each wheel bundles a native library and carries a platform tag with a minimum-OS floor. pip picks
the matching wheel automatically:
| Platform | Wheel tag | Minimum requirement |
|---|---|---|
| Linux x86-64 | manylinux_2_35_x86_64 |
glibc >= 2.35 (e.g. Ubuntu 22.04, Debian 12) |
| Linux aarch64 | manylinux_2_35_aarch64 |
glibc >= 2.35 (e.g. Ubuntu 22.04, Debian 12) |
| Linux x86-64 musl | musllinux_1_2_x86_64 |
musl libc >= 1.2 (e.g. Alpine 3.13+) |
| Linux aarch64 musl | musllinux_1_2_aarch64 |
musl libc >= 1.2 (e.g. Alpine 3.13+) |
| macOS arm64 | macosx_11_0_arm64 |
macOS >= 11.0 |
| macOS x86-64 | macosx_10_15_x86_64 |
macOS >= 10.15 |
| Windows x86-64 | win_amd64 |
64-bit Windows |
| Windows arm64 | win_arm64 |
ARM64 Windows |
Any Python 3 works — the wheels are ABI-agnostic. On an older glibc or macOS than the floor above,
pip finds no matching wheel; build the native driver from source instead.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file adbc_driver_spanner-0.7.0-py3-none-win_arm64.whl.
File metadata
- Download URL: adbc_driver_spanner-0.7.0-py3-none-win_arm64.whl
- Upload date:
- Size: 5.5 MB
- Tags: Python 3, Windows ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea38b4af2e0268fedb644c0e7551c2f993fe81eb49d773918ac7271e4e48ab71
|
|
| MD5 |
4f1ba60fd1470ce75ed71a9ff85ecffe
|
|
| BLAKE2b-256 |
0f2bfe102d250fa33313cde46fe145290a23a5694bfa38f7de1778de78a9d651
|
Provenance
The following attestation bundles were made for adbc_driver_spanner-0.7.0-py3-none-win_arm64.whl:
Publisher:
libraries.yml on fornwall/adbc-spanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adbc_driver_spanner-0.7.0-py3-none-win_arm64.whl -
Subject digest:
ea38b4af2e0268fedb644c0e7551c2f993fe81eb49d773918ac7271e4e48ab71 - Sigstore transparency entry: 2177881371
- Sigstore integration time:
-
Permalink:
fornwall/adbc-spanner@55374862704ce1868a5cfaf9828de5ff136a868a -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/fornwall
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
libraries.yml@55374862704ce1868a5cfaf9828de5ff136a868a -
Trigger Event:
push
-
Statement type:
File details
Details for the file adbc_driver_spanner-0.7.0-py3-none-win_amd64.whl.
File metadata
- Download URL: adbc_driver_spanner-0.7.0-py3-none-win_amd64.whl
- Upload date:
- Size: 5.7 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76b69416ca843c9fe8509253829c89c278d6379991ff2f6b096f97cdc1285bc8
|
|
| MD5 |
3d0854f98f58a42dd18260ce0dd79d0a
|
|
| BLAKE2b-256 |
5e9492174d20d1fc3b69ad422c48d56e25fbc0249be028854873c4d43b22baad
|
Provenance
The following attestation bundles were made for adbc_driver_spanner-0.7.0-py3-none-win_amd64.whl:
Publisher:
libraries.yml on fornwall/adbc-spanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adbc_driver_spanner-0.7.0-py3-none-win_amd64.whl -
Subject digest:
76b69416ca843c9fe8509253829c89c278d6379991ff2f6b096f97cdc1285bc8 - Sigstore transparency entry: 2177881153
- Sigstore integration time:
-
Permalink:
fornwall/adbc-spanner@55374862704ce1868a5cfaf9828de5ff136a868a -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/fornwall
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
libraries.yml@55374862704ce1868a5cfaf9828de5ff136a868a -
Trigger Event:
push
-
Statement type:
File details
Details for the file adbc_driver_spanner-0.7.0-py3-none-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: adbc_driver_spanner-0.7.0-py3-none-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: Python 3, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c61b67a044a0efe9d8d3dcca017c62910d2d4930e98df022097ac3e4a3925841
|
|
| MD5 |
f61f8f71a2160e1cc4a5007bca8cd833
|
|
| BLAKE2b-256 |
6bc18ec75b9d94b80c75804e127a297fabb3f0119f872157218f925a9a56f0ae
|
Provenance
The following attestation bundles were made for adbc_driver_spanner-0.7.0-py3-none-musllinux_1_2_x86_64.whl:
Publisher:
libraries.yml on fornwall/adbc-spanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adbc_driver_spanner-0.7.0-py3-none-musllinux_1_2_x86_64.whl -
Subject digest:
c61b67a044a0efe9d8d3dcca017c62910d2d4930e98df022097ac3e4a3925841 - Sigstore transparency entry: 2177879054
- Sigstore integration time:
-
Permalink:
fornwall/adbc-spanner@55374862704ce1868a5cfaf9828de5ff136a868a -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/fornwall
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
libraries.yml@55374862704ce1868a5cfaf9828de5ff136a868a -
Trigger Event:
push
-
Statement type:
File details
Details for the file adbc_driver_spanner-0.7.0-py3-none-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: adbc_driver_spanner-0.7.0-py3-none-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 5.3 MB
- Tags: Python 3, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f0ae490a6aeb303c4db42c7b1ff98f1cf3576d9ea5a852616789f90b1d6c82b
|
|
| MD5 |
5392d034aa57320692cff8a5c3478050
|
|
| BLAKE2b-256 |
9557560049d6a10a403667185dbfb917d849260245fb83f1deec94d257df4d78
|
Provenance
The following attestation bundles were made for adbc_driver_spanner-0.7.0-py3-none-musllinux_1_2_aarch64.whl:
Publisher:
libraries.yml on fornwall/adbc-spanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adbc_driver_spanner-0.7.0-py3-none-musllinux_1_2_aarch64.whl -
Subject digest:
4f0ae490a6aeb303c4db42c7b1ff98f1cf3576d9ea5a852616789f90b1d6c82b - Sigstore transparency entry: 2177882382
- Sigstore integration time:
-
Permalink:
fornwall/adbc-spanner@55374862704ce1868a5cfaf9828de5ff136a868a -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/fornwall
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
libraries.yml@55374862704ce1868a5cfaf9828de5ff136a868a -
Trigger Event:
push
-
Statement type:
File details
Details for the file adbc_driver_spanner-0.7.0-py3-none-manylinux_2_35_x86_64.whl.
File metadata
- Download URL: adbc_driver_spanner-0.7.0-py3-none-manylinux_2_35_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: Python 3, manylinux: glibc 2.35+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6845a4e6e4f67f302dec1a57742cefa0024a77f4b5f8299ee1b0f4966ada7e63
|
|
| MD5 |
911368e2543e2064c41333305544b853
|
|
| BLAKE2b-256 |
5d08df67c2b0706e1188af6fa5ee3cc3c25220ca84d24bee8378cf1bf87f2cd2
|
Provenance
The following attestation bundles were made for adbc_driver_spanner-0.7.0-py3-none-manylinux_2_35_x86_64.whl:
Publisher:
libraries.yml on fornwall/adbc-spanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adbc_driver_spanner-0.7.0-py3-none-manylinux_2_35_x86_64.whl -
Subject digest:
6845a4e6e4f67f302dec1a57742cefa0024a77f4b5f8299ee1b0f4966ada7e63 - Sigstore transparency entry: 2177880194
- Sigstore integration time:
-
Permalink:
fornwall/adbc-spanner@55374862704ce1868a5cfaf9828de5ff136a868a -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/fornwall
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
libraries.yml@55374862704ce1868a5cfaf9828de5ff136a868a -
Trigger Event:
push
-
Statement type:
File details
Details for the file adbc_driver_spanner-0.7.0-py3-none-manylinux_2_35_aarch64.whl.
File metadata
- Download URL: adbc_driver_spanner-0.7.0-py3-none-manylinux_2_35_aarch64.whl
- Upload date:
- Size: 5.2 MB
- Tags: Python 3, manylinux: glibc 2.35+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6641af4274ca97b307b782a158935afe15a14bd470331682c6d21d7227f6290d
|
|
| MD5 |
4bfe4c0acdd7a29fc7743a925d5eb6d0
|
|
| BLAKE2b-256 |
c5e089d852686ebf73fabbfa34c3357c7d496fa4cc9e850cebd2ae7df0ff2070
|
Provenance
The following attestation bundles were made for adbc_driver_spanner-0.7.0-py3-none-manylinux_2_35_aarch64.whl:
Publisher:
libraries.yml on fornwall/adbc-spanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adbc_driver_spanner-0.7.0-py3-none-manylinux_2_35_aarch64.whl -
Subject digest:
6641af4274ca97b307b782a158935afe15a14bd470331682c6d21d7227f6290d - Sigstore transparency entry: 2177881944
- Sigstore integration time:
-
Permalink:
fornwall/adbc-spanner@55374862704ce1868a5cfaf9828de5ff136a868a -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/fornwall
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
libraries.yml@55374862704ce1868a5cfaf9828de5ff136a868a -
Trigger Event:
push
-
Statement type:
File details
Details for the file adbc_driver_spanner-0.7.0-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: adbc_driver_spanner-0.7.0-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 5.1 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5020a188776f8c53452f6f06de9bec923a312328dbe792ef267e318e455cafc
|
|
| MD5 |
7f161abdd5384d3b460242067ace923a
|
|
| BLAKE2b-256 |
98e237b8e2eca03a559c8373305305ed1a14a2368851ae8cc40e5383af385991
|
Provenance
The following attestation bundles were made for adbc_driver_spanner-0.7.0-py3-none-macosx_11_0_arm64.whl:
Publisher:
libraries.yml on fornwall/adbc-spanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adbc_driver_spanner-0.7.0-py3-none-macosx_11_0_arm64.whl -
Subject digest:
a5020a188776f8c53452f6f06de9bec923a312328dbe792ef267e318e455cafc - Sigstore transparency entry: 2177879890
- Sigstore integration time:
-
Permalink:
fornwall/adbc-spanner@55374862704ce1868a5cfaf9828de5ff136a868a -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/fornwall
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
libraries.yml@55374862704ce1868a5cfaf9828de5ff136a868a -
Trigger Event:
push
-
Statement type:
File details
Details for the file adbc_driver_spanner-0.7.0-py3-none-macosx_10_15_x86_64.whl.
File metadata
- Download URL: adbc_driver_spanner-0.7.0-py3-none-macosx_10_15_x86_64.whl
- Upload date:
- Size: 5.4 MB
- Tags: Python 3, macOS 10.15+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a9a4600131c4c326ca2bcd96865afd2316d632b74fc496c564ebd0c07f1a8b1e
|
|
| MD5 |
1710adf36ce7528391fbc9a2c27d03b4
|
|
| BLAKE2b-256 |
09ed029d10792ee26f72aea47ade8c46a98e7b099a0775e12eb94f9b41f929a1
|
Provenance
The following attestation bundles were made for adbc_driver_spanner-0.7.0-py3-none-macosx_10_15_x86_64.whl:
Publisher:
libraries.yml on fornwall/adbc-spanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adbc_driver_spanner-0.7.0-py3-none-macosx_10_15_x86_64.whl -
Subject digest:
a9a4600131c4c326ca2bcd96865afd2316d632b74fc496c564ebd0c07f1a8b1e - Sigstore transparency entry: 2177880641
- Sigstore integration time:
-
Permalink:
fornwall/adbc-spanner@55374862704ce1868a5cfaf9828de5ff136a868a -
Branch / Tag:
refs/tags/v0.7.0 - Owner: https://github.com/fornwall
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
libraries.yml@55374862704ce1868a5cfaf9828de5ff136a868a -
Trigger Event:
push
-
Statement type: