Skip to main content

Read the data of an ODBC data source as sequence of Apache Arrow record batches.

Project description

arrow-odbc-py

Licence PyPI version Documentation Status

Fill Apache Arrow arrays from ODBC data sources. This package is build on top of the pyarrow Python package and arrow-odbc Rust crate and enables you to read the data of an ODBC data source as sequence of Apache Arrow record batches.

This package can also be used to insert data in Arrow record batches to database tables.

This package has been designed to be easily deployable, so it provides a prebuild many linux wheel which is independent of the specific version of your Python interpreter and the specific Arrow Version you want to use. It will dynamically link against the ODBC driver manager provided by your system.

Users looking for more features than just bulk fetching/inserting data from/into ODBC data sources in Python should also take a look at turbodbc which has a helpful community and seen a lot of battle testing. This Python package is more narrow in Scope (which is a fancy way of saying it has less features), as it is only concerned with bulk fetching Arrow Arrays. arrow-odbc may have less features than turbodbc, but it is easier to install and more resilient to version changes in pyarrow, since it is independent of C++ ABI, system dependencies (with the exeception of your ODBC driver manager of course) and your specific Python ABI. It also offers pre build wheels windows, linux and OS-X on pypi. In addition to that there is also a conda-forge recipie (thanks to @timkpaine).

About Arrow

Apache Arrow defines a language-independent columnar memory format for flat and hierarchical data, organized for efficient analytic operations on modern hardware like CPUs and GPUs. The Arrow memory format also supports zero-copy reads for lightning-fast data access without serialization overhead.

About ODBC

ODBC (Open DataBase Connectivity) is a standard which enables you to access data from a wide variaty of data sources using SQL.

Usage

Query

from arrow_odbc import read_arrow_batches_from_odbc

connection_string="Driver={ODBC Driver 17 for SQL Server};Server=localhost;"

reader = read_arrow_batches_from_odbc(
    query=f"SELECT * FROM MyTable WHERE a=?",
    connection_string=connection_string,
    batch_size=1000,
    parameters=["I'm a positional query parameter"],
    user="SA",
    password="My@Test@Password",
)

for batch in reader:
    # Process arrow batches
    df = batch.to_pandas()
    # ...

Insert

from arrow_odbc import insert_into_table
import pyarrow as pa
import pandas


def dataframe_to_table(df):
    table = pa.Table.from_pandas(df)
    reader = pa.RecordBatchReader.from_batches(table.schema, table.to_batches())
    insert_into_table(
        connection_string=connection_string,
        user="SA",
        password="My@Test@Password",
        chunk_size=1000,
        table="MyTable",
        reader=reader,
    )

Installation

Installing ODBC driver manager

The provided wheels dynamically link against the driver manager, which must be provided by the system.

Windows

Nothing to do. ODBC driver manager is preinstalled.

Ubuntu

sudo apt-get install unixodbc-dev

OS-X

You can use homebrew to install UnixODBC

brew install unixodbc

Installing Rust toolchain

Note: Only required if building from source

To build from source you need to install the Rust toolchain. Installation instruction can be found here: https://www.rust-lang.org/tools/install

Installing the wheel

Wheels have been uploaded to PyPi and can be installed using pip. The wheel (including the manylinux wheel) will link against the your system ODBC driver manager at runtime. If there are no prebuild wheels for your platform, you can build the wheel from source. For this the rust toolchain must be installed.

pip install arrow-odbc

arrow-odbc utilizes cffi and the Arrow C-Interface to glue Rust and Python code together. Therefore the wheel does not need to be build against the precise version either of Python or Arrow.

Matching of ODBC to Arrow types then querying

ODBC Arrow
Numeric(p <= 38) Decimal128
Decimal(p <= 38, s >= 0) Decimal128
Integer Int32
SmallInt Int16
Real Float32
Float(p <=24) Float32
Double Float64
Float(p > 24) Float64
Date Date32
LongVarbinary Binary
Timestamp(p = 0) TimestampSecond
Timestamp(p: 1..3) TimestampMilliSecond
Timestamp(p: 4..6) TimestampMicroSecond
Timestamp(p >= 7 ) TimestampNanoSecond
BigInt Int64
TinyInt Int8
Bit Boolean
Varbinary Binary
Binary FixedSizedBinary
All others Utf8

Matching of Arrow to ODBC types then inserting

Arrow ODBC
Utf8 VarChar
Decimal128(p, s = 0) VarChar(p + 1)
Decimal128(p, s != 0) VarChar(p + 2)
Decimal128(p, s < 0) VarChar(p - s + 1)
Decimal256(p, s = 0) VarChar(p + 1)
Decimal256(p, s != 0) VarChar(p + 2)
Decimal256(p, s < 0) VarChar(p - s + 1)
Int8 TinyInt
Int16 SmallInt
Int32 Integer
Int64 BigInt
Float16 Real
Float32 Real
Float64 Double
Timestamp s Timestamp(7)
Timestamp ms Timestamp(7)
Timestamp us Timestamp(7)
Timestamp ns Timestamp(7)
Date32 Date
Date64 Date
Time32 s Time
Time32 ms VarChar(12)
Time64 us VarChar(15)
Time64 ns VarChar(16)
Binary Varbinary
FixedBinary(l) Varbinary(l)
All others Unsupported

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

arrow_odbc-0.3.13.tar.gz (41.7 kB view details)

Uploaded Source

Built Distributions

arrow_odbc-0.3.13-py3-none-win_amd64.whl (323.1 kB view details)

Uploaded Python 3 Windows x86-64

arrow_odbc-0.3.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (808.8 kB view details)

Uploaded Python 3 manylinux: glibc 2.17+ x86-64

arrow_odbc-0.3.13-py3-none-macosx_10_7_x86_64.whl (458.0 kB view details)

Uploaded Python 3 macOS 10.7+ x86-64

File details

Details for the file arrow_odbc-0.3.13.tar.gz.

File metadata

  • Download URL: arrow_odbc-0.3.13.tar.gz
  • Upload date:
  • Size: 41.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.2

File hashes

Hashes for arrow_odbc-0.3.13.tar.gz
Algorithm Hash digest
SHA256 a169c4b806580c5daf5b9687d6d3dcbee2ac5dbba08b20b12db018383f7d75e2
MD5 18bb3519694d10454fbcbd3c4caafac8
BLAKE2b-256 5af55b3f4890dd9df57b0078e03f71808141bc54dad2e1219c91ed8cc4a35f5a

See more details on using hashes here.

File details

Details for the file arrow_odbc-0.3.13-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for arrow_odbc-0.3.13-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 fd0f594b0d37d376f3648b58afda68c258b2964a4c8592d009a1772ba174dd77
MD5 c4879a148792890988539b1025762109
BLAKE2b-256 f00a1350dda696787c7e3f3e70e591d894c8723fb5ca143849c4509f848a6bde

See more details on using hashes here.

File details

Details for the file arrow_odbc-0.3.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for arrow_odbc-0.3.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 762b521b14debdd93ad96b4db62e392ad7f362fd3f9676b2280ea0daef189b32
MD5 b50d339cddd578e315b8ba49eada0d36
BLAKE2b-256 3bdfd498f3434c0036bc84d2244eb11990610b1b1b5fae701412aa601e1cb2a3

See more details on using hashes here.

File details

Details for the file arrow_odbc-0.3.13-py3-none-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for arrow_odbc-0.3.13-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 688337fb9420b74fcf41a247f534bacd4a2ef394d48276fd9d0cc8f3d58a787f
MD5 23a212c967331b1381685b017fb09d6b
BLAKE2b-256 aeb269db3294ad485b0effd9a0c7474cef289a50bc63cc4eb5c5910da9b44f97

See more details on using hashes here.

Supported by

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