mirror of
https://github.com/hanzo-ds/driver.git
synced 2026-10-30 20:32:40 +00:00
The wire protocol was the last holdout and it was not cosmetic: the Hanzo Datastore server reads X-Datastore-User, and answers a request bearing X-ClickHouse-User with 401. Verified against the live server, both directions. So a client still sending the old headers is not merely off-brand, it cannot authenticate over HTTP. Everything else follows: types, dialects, error modules, docstrings and doc links now name Datastore, and doc URLs point at docs.hanzo.ai/datastore rather than the upstream vendor's site. Zero occurrences of the old name remain. Still cut from the pinned upstream version, so behaviour is unchanged.
156 lines
3.9 KiB
ReStructuredText
156 lines
3.9 KiB
ReStructuredText
Datastore Python Driver
|
|
========================
|
|
|
|
.. image:: https://img.shields.io/pypi/v/datastore-driver.svg
|
|
:target: https://pypi.org/project/datastore-driver
|
|
|
|
.. image:: https://coveralls.io/repos/github/mymarilyn/datastore-driver/badge.svg?branch=master
|
|
:target: https://coveralls.io/github/mymarilyn/datastore-driver?branch=master
|
|
|
|
.. image:: https://img.shields.io/pypi/l/datastore-driver.svg
|
|
:target: https://pypi.org/project/datastore-driver
|
|
|
|
.. image:: https://img.shields.io/pypi/pyversions/datastore-driver.svg
|
|
:target: https://pypi.org/project/datastore-driver
|
|
|
|
.. image:: https://img.shields.io/pypi/dm/datastore-driver.svg
|
|
:target: https://pypi.org/project/datastore-driver
|
|
|
|
.. image:: https://github.com/mymarilyn/datastore-driver/actions/workflows/actions.yml/badge.svg
|
|
:target: https://github.com/mymarilyn/datastore-driver/actions/workflows/actions.yml
|
|
|
|
Datastore Python Driver with native (TCP) interface support.
|
|
|
|
Asynchronous wrapper is available here: https://github.com/mymarilyn/aioch
|
|
|
|
Features
|
|
========
|
|
|
|
- External data for query processing.
|
|
|
|
- Query settings.
|
|
|
|
- Compression support.
|
|
|
|
- TLS support.
|
|
|
|
- Types support:
|
|
|
|
* Float32/64
|
|
* [U]Int8/16/32/64/128/256
|
|
* Date/Date32/DateTime('timezone')/DateTime64('timezone')
|
|
* String/FixedString(N)
|
|
* Enum8/16
|
|
* Array(T)
|
|
* Nullable(T)
|
|
* Bool
|
|
* UUID
|
|
* Decimal
|
|
* IPv4/IPv6
|
|
* LowCardinality(T)
|
|
* SimpleAggregateFunction(F, T)
|
|
* Tuple(T1, T2, ...)
|
|
* Nested
|
|
* Map(key, value)
|
|
|
|
- Query progress information.
|
|
|
|
- Block by block results streaming.
|
|
|
|
- Reading query profile info.
|
|
|
|
- Receiving server logs.
|
|
|
|
- Multiple hosts support.
|
|
|
|
- Python DB API 2.0 specification support.
|
|
|
|
- Optional NumPy arrays support.
|
|
|
|
Documentation
|
|
=============
|
|
|
|
Documentation is available at https://datastore-driver.readthedocs.io.
|
|
|
|
Usage
|
|
=====
|
|
|
|
There are two ways to communicate with server:
|
|
|
|
- using pure Client;
|
|
- using DB API.
|
|
|
|
Pure Client example:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> from datastore_driver import Client
|
|
>>>
|
|
>>> client = Client('localhost')
|
|
>>>
|
|
>>> client.execute('SHOW TABLES')
|
|
[('test',)]
|
|
>>> client.execute('DROP TABLE IF EXISTS test')
|
|
[]
|
|
>>> client.execute('CREATE TABLE test (x Int32) ENGINE = Memory')
|
|
[]
|
|
>>> client.execute(
|
|
... 'INSERT INTO test (x) VALUES',
|
|
... [{'x': 100}]
|
|
... )
|
|
1
|
|
>>> client.execute('INSERT INTO test (x) VALUES', [[200]])
|
|
1
|
|
>>> client.execute(
|
|
... 'INSERT INTO test (x) '
|
|
... 'SELECT * FROM system.numbers LIMIT %(limit)s',
|
|
... {'limit': 3}
|
|
... )
|
|
[]
|
|
>>> client.execute('SELECT sum(x) FROM test')
|
|
[(303,)]
|
|
|
|
DB API example:
|
|
|
|
.. code-block:: python
|
|
|
|
>>> from datastore_driver import connect
|
|
>>>
|
|
>>> conn = connect('datastore://localhost')
|
|
>>> cursor = conn.cursor()
|
|
>>>
|
|
>>> cursor.execute('SHOW TABLES')
|
|
>>> cursor.fetchall()
|
|
[('test',)]
|
|
>>> cursor.execute('DROP TABLE IF EXISTS test')
|
|
>>> cursor.fetchall()
|
|
[]
|
|
>>> cursor.execute('CREATE TABLE test (x Int32) ENGINE = Memory')
|
|
>>> cursor.fetchall()
|
|
[]
|
|
>>> cursor.executemany(
|
|
... 'INSERT INTO test (x) VALUES',
|
|
... [{'x': 100}]
|
|
... )
|
|
>>> cursor.rowcount
|
|
1
|
|
>>> cursor.executemany('INSERT INTO test (x) VALUES', [[200]])
|
|
>>> cursor.rowcount
|
|
1
|
|
>>> cursor.execute(
|
|
... 'INSERT INTO test (x) '
|
|
... 'SELECT * FROM system.numbers LIMIT %(limit)s',
|
|
... {'limit': 3}
|
|
... )
|
|
>>> cursor.rowcount
|
|
0
|
|
>>> cursor.execute('SELECT sum(x) FROM test')
|
|
>>> cursor.fetchall()
|
|
[(303,)]
|
|
|
|
License
|
|
=======
|
|
|
|
Datastore Python Driver is distributed under the `MIT license
|
|
<http://www.opensource.org/licenses/mit-license.php>`_.
|