Skip to main content

Databend Driver Python Binding

Project description

databend-driver

Databend Python Client

image License image

Usage

PEP 249 Cursor Object

from databend_driver import BlockingDatabendClient

client = BlockingDatabendClient('databend://root:root@localhost:8000/?sslmode=disable')
cursor = client.cursor()

cursor.execute(
    """
    CREATE TABLE test (
        i64 Int64,
        u64 UInt64,
        f64 Float64,
        s   String,
        s2  String,
        d   Date,
        t   DateTime
    )
    """
)
cursor.execute("INSERT INTO test VALUES (?, ?, ?, ?, ?, ?, ?)", (1, 1, 1.0, 'hello', 'world', '2021-01-01', '2021-01-01 00:00:00'))
cursor.execute("SELECT * FROM test")
rows = cursor.fetchall()
for row in rows:
    print(row.values())

Blocking Connection Object

from databend_driver import BlockingDatabendClient

client = BlockingDatabendClient('databend://root:root@localhost:8000/?sslmode=disable')
conn = client.get_conn()
conn.exec(
    """
    CREATE TABLE test (
        i64 Int64,
        u64 UInt64,
        f64 Float64,
        s   String,
        s2  String,
        d   Date,
        t   DateTime
    )
    """
)
rows = conn.query_iter("SELECT * FROM test")
for row in rows:
    print(row.values())

Asyncio Connection Object

import asyncio
from databend_driver import AsyncDatabendClient

async def main():
    client = AsyncDatabendClient('databend://root:root@localhost:8000/?sslmode=disable')
    conn = await client.get_conn()
    await conn.exec(
        """
        CREATE TABLE test (
            i64 Int64,
            u64 UInt64,
            f64 Float64,
            s   String,
            s2  String,
            d   Date,
            t   DateTime
        )
        """
    )
    rows = await conn.query_iter("SELECT * FROM test")
    async for row in rows:
        print(row.values())

asyncio.run(main())

Parameter bindings

# Test with positional parameters
row = await context.conn.query_row("SELECT ?, ?, ?, ?", (3, False, 4, "55"))
row = await context.conn.query_row(
    "SELECT :a, :b, :c, :d", {"a": 3, "b": False, "c": 4, "d": "55"}
)
row = await context.conn.query_row(
    "SELECT ?", 3
)
row = await context.conn.query_row("SELECT ?, ?, ?, ?", params = (3, False, 4, "55"))

Type Mapping

Databend Types

General Data Types

Databend Python
BOOLEAN bool
TINYINT int
SMALLINT int
INT int
BIGINT int
FLOAT float
DOUBLE float
DECIMAL decimal.Decimal
DATE datetime.date
TIMESTAMP datetime.datetime
INTERVAL datetime.timedelta
VARCHAR str
BINARY bytes

Semi-Structured Data Types

Databend Python
ARRAY list
TUPLE tuple
MAP dict
VARIANT str
BITMAP str
GEOMETRY str
GEOGRAPHY str

Note: VARIANT is a json encoded string. Example:

CREATE TABLE example (
    data VARIANT
);
INSERT INTO example VALUES ('{"a": 1, "b": "hello"}');
row = await conn.query_row("SELECT * FROM example limit 1;")
data = row.values()[0]
value = json.loads(data)
print(value)

APIs

AsyncDatabendClient

class AsyncDatabendClient:
    def __init__(self, dsn: str): ...
    async def get_conn(self) -> AsyncDatabendConnection: ...

AsyncDatabendConnection

class AsyncDatabendConnection:
    async def info(self) -> ConnectionInfo: ...
    async def version(self) -> str: ...
    async def exec(self, sql: str, params: list[string] | tuple[string] | any = None) -> int: ...
    async def query_row(self, sql: str, params: list[string] | tuple[string] | any = None) -> Row: ...
    async def query_iter(self, sql: str, params: list[string] | tuple[string] | any = None) -> RowIterator: ...
    async def stream_load(self, sql: str, data: list[list[str]]) -> ServerStats: ...
    async def load_file(self, sql: str, file: str, format_option: dict, copy_options: dict = None) -> ServerStats: ...

BlockingDatabendClient

class BlockingDatabendClient:
    def __init__(self, dsn: str): ...
    def get_conn(self) -> BlockingDatabendConnection: ...
    def cursor(self) -> BlockingDatabendCursor: ...

BlockingDatabendConnection

class BlockingDatabendConnection:
    def info(self) -> ConnectionInfo: ...
    def version(self) -> str: ...
    def exec(self, sql: str, params: list[string] | tuple[string] | any = None) -> int: ...
    def query_row(self, sql: str, params: list[string] | tuple[string] | any = None) -> Row: ...
    def query_iter(self, sql: str, params: list[string] | tuple[string] | any = None) -> RowIterator: ...
    def stream_load(self, sql: str, data: list[list[str]]) -> ServerStats: ...
    def load_file(self, sql: str, file: str, format_option: dict, copy_options: dict = None) -> ServerStats: ...

BlockingDatabendCursor

class BlockingDatabendCursor:
    @property
    def description(self) -> list[tuple[str, str, int | None, int | None, int | None, int | None, bool | None]] | None: ...
    @property
    def rowcount(self) -> int: ...
    def close(self) -> None: ...
    def execute(self, operation: str, params: list[string] | tuple[string] = None) -> None | int: ...
    def executemany(self, operation: str, params: list[string] | tuple[string] = None, values: list[list[string] | tuple[string]]) -> None | int: ...
    def fetchone(self) -> Row | None: ...
    def fetchmany(self, size: int = 1) -> list[Row]: ...
    def fetchall(self) -> list[Row]: ...

    # Optional DB API Extensions
    def next(self) -> Row: ...
    def __next__(self) -> Row: ...
    def __iter__(self) -> BlockingDatabendCursor: ...

Row

class Row:
    def values(self) -> tuple: ...
    def __len__(self) -> int: ...
    def __iter__(self) -> Row: ...
    def __next__(self) -> any: ...
    def __dict__(self) -> dict: ...
    def __getitem__(self, key: int | str) -> any: ...

RowIterator

class RowIterator:
    def schema(self) -> Schema: ...

    def __iter__(self) -> RowIterator: ...
    def __next__(self) -> Row: ...

    def __aiter__(self) -> RowIterator: ...
    async def __anext__(self) -> Row: ...

Field

class Field:
    @property
    def name(self) -> str: ...
    @property
    def data_type(self) -> str: ...

Schema

class Schema:
    def fields(self) -> list[Field]: ...

ServerStats

class ServerStats:
    @property
    def total_rows(self) -> int: ...
    @property
    def total_bytes(self) -> int: ...
    @property
    def read_rows(self) -> int: ...
    @property
    def read_bytes(self) -> int: ...
    @property
    def write_rows(self) -> int: ...
    @property
    def write_bytes(self) -> int: ...
    @property
    def running_time_ms(self) -> float: ...

ConnectionInfo

class ConnectionInfo:
    @property
    def handler(self) -> str: ...
    @property
    def host(self) -> str: ...
    @property
    def port(self) -> int: ...
    @property
    def user(self) -> str: ...
    @property
    def database(self) -> str | None: ...
    @property
    def warehouse(self) -> str | None: ...

Development

cd tests
make up
cd bindings/python
uv sync
source .venv/bin/activate
maturin develop --uv

behave tests/asyncio
behave tests/blocking
behave tests/cursor

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

databend_driver-0.27.5-cp37-abi3-win_amd64.whl (6.6 MB view details)

Uploaded CPython 3.7+Windows x86-64

databend_driver-0.27.5-cp37-abi3-manylinux_2_28_aarch64.whl (6.2 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.28+ ARM64

databend_driver-0.27.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ x86-64

databend_driver-0.27.5-cp37-abi3-macosx_11_0_arm64.whl (5.9 MB view details)

Uploaded CPython 3.7+macOS 11.0+ ARM64

databend_driver-0.27.5-cp37-abi3-macosx_10_12_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.7+macOS 10.12+ x86-64

File details

Details for the file databend_driver-0.27.5-cp37-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for databend_driver-0.27.5-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d82bb0ef04a3590ba848e9421d2cf3fb6df6a23a48cee77b9e9e2df07e8e10f6
MD5 49c42fe858ac462496bf6576cf17f259
BLAKE2b-256 b92a92b253fdc055bc6a176566a43b16a955a20180eae9a7a16c160da85b8cac

See more details on using hashes here.

Provenance

The following attestation bundles were made for databend_driver-0.27.5-cp37-abi3-win_amd64.whl:

Publisher: bindings.python.yml on databendlabs/bendsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file databend_driver-0.27.5-cp37-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for databend_driver-0.27.5-cp37-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c55479161751500a2904dc396fc42118d571c623d8dfb8c4207e51c8c7ba5571
MD5 c146f2a75bff18c34efc4edd2354a3dc
BLAKE2b-256 563d7977ba952a8fc966c397966a826f982afc975a5e84daa3aaa87965a73d5c

See more details on using hashes here.

Provenance

The following attestation bundles were made for databend_driver-0.27.5-cp37-abi3-manylinux_2_28_aarch64.whl:

Publisher: bindings.python.yml on databendlabs/bendsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file databend_driver-0.27.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for databend_driver-0.27.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 591ede35ebd03604f0c5d9000a15149ca14120c646d9f8cefc14f35a6987d379
MD5 16abf6561e5f5767b841e69c8fc23ef5
BLAKE2b-256 1b6e725b0a8c3a4d30b3f4f4237ad7d666f86d736a8ccef2ba2d989d13f5ae86

See more details on using hashes here.

Provenance

The following attestation bundles were made for databend_driver-0.27.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: bindings.python.yml on databendlabs/bendsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file databend_driver-0.27.5-cp37-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for databend_driver-0.27.5-cp37-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ab83a374fec7411dbe341e7bef20bdab16d63b8768d31862e99343e40c85a76c
MD5 b2243f39eb120d97df11f92e71022c1e
BLAKE2b-256 f345deaee0313be3482503f0ea0ce57a80a984a45496e2f0a7a3cf6153515753

See more details on using hashes here.

Provenance

The following attestation bundles were made for databend_driver-0.27.5-cp37-abi3-macosx_11_0_arm64.whl:

Publisher: bindings.python.yml on databendlabs/bendsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file databend_driver-0.27.5-cp37-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for databend_driver-0.27.5-cp37-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c48f716b9dbfc371a705f02576ba1dc036d53b779dae4e717d76c53d2ee95245
MD5 e7d2f16f16ca412b7255c8189f091c9d
BLAKE2b-256 ace2b8a18385dd49482d9240627cc3a1cfe648bb3e90862c995f996b10111639

See more details on using hashes here.

Provenance

The following attestation bundles were made for databend_driver-0.27.5-cp37-abi3-macosx_10_12_x86_64.whl:

Publisher: bindings.python.yml on databendlabs/bendsql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page