Skip to main content

Python Driver for Databend

Connect to Databend using Python with our official drivers supporting both synchronous and asynchronous operations.

Quick Start

Choose your preferred approach:

PackageBest ForInstallation
databend-driverDirect database operations, async/awaitpip install databend-driver
databend-sqlalchemyORM integration, existing SQLAlchemy appspip install databend-sqlalchemy

Connection String: See Drivers Overview for DSN format and examples.


Features

  • Native Performance: Direct connection to Databend
  • Async/Sync Support: Choose your programming style
  • PEP 249 Compatible: Standard Python DB API
  • Type Safety: Full Python type mapping

Synchronous Usage

from databend_driver import BlockingDatabendClient

# Connect and execute
client = BlockingDatabendClient('<your-dsn>')
cursor = client.cursor()

# DDL: Create table
cursor.execute("CREATE TABLE users (id INT, name STRING)")

# Write: Insert data
cursor.execute("INSERT INTO users VALUES (?, ?)", (1, 'Alice'))

# Query: Read data
# Query: Read data
cursor.execute("SELECT * FROM users")

# Get column names
# cursor.description returns a list of tuples, where the first element is the column name
print(f"Columns: {[desc[0] for desc in cursor.description]}")

for row in cursor.fetchall():
# row is a databend_driver.Row object
# Access by column name
print(f"id: {row['id']}, name: {row['name']}")

cursor.close()

Working with Row Objects

The Row object supports multiple access patterns and methods:

for row in cursor.fetchall():
# 1. Access by column name (Recommended)
print(f"Name: {row['name']}")

# 2. Access by index
print(f"First column: {row[0]}")

# 3. Convert to tuple
print(f"Values: {row.values()}")

# 4. Explicit methods
print(row.get_by_field('name'))
print(row.get_by_index(0))

Asynchronous Usage

import asyncio
from databend_driver import AsyncDatabendClient

async def main():
client = AsyncDatabendClient('<your-dsn>')
conn = await client.get_conn()

# DDL: Create table
await conn.exec("CREATE TABLE users (id INT, name STRING)")

# Write: Insert data
await conn.exec("INSERT INTO users VALUES (?, ?)", (1, 'Alice'))

# Query: Read data
rows = await conn.query_iter("SELECT * FROM users")
async for row in rows:
print(row.values())

await conn.close()

asyncio.run(main())

databend-sqlalchemy

For SQLAlchemy ORM integration:

from sqlalchemy import create_engine, text

engine = create_engine('<your-dsn>')
with engine.connect() as conn:
result = conn.execute(text("SELECT 1"))
print(result.fetchall())

Data Type Mappings

DatabendPythonNotes
Numeric Types
BOOLEANbool
TINYINTint
SMALLINTint
INTint
BIGINTint
FLOATfloat
DOUBLEfloat
DECIMALdecimal.DecimalPrecision preserved
Date/Time
DATEdatetime.date
TIMESTAMPdatetime.datetime
INTERVALdatetime.timedelta
Text/Binary
VARCHARstrUTF-8 encoded
BINARYbytes
Complex Types
ARRAYlistNested structures supported
TUPLEtuple
MAPdict
VARIANTstrJSON-encoded
BITMAPstrBase64-encoded
GEOMETRYstrWKT format

Resources

Try Databend Cloud for FREE

Multimodal, object-storage-native warehouse for BI, vectors, search, and geo.

Snowflake-compatible SQL with automatic scaling.

Sign up and get $200 in credits.

Try it today