You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by jf...@apache.org on 2021/03/24 10:01:51 UTC

[iotdb] branch feature/improve-py-client created (now 468c36e)

This is an automated email from the ASF dual-hosted git repository.

jfeinauer pushed a change to branch feature/improve-py-client
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


      at 468c36e  Improve Python Client: * Add / Fix the insert_str_record method for type inference (sends TSInsertStringRecord) * Add Support for python testcontainer with a specific IoTDB Container. * Improved the readme a bit

This branch includes the following new commits:

     new 468c36e  Improve Python Client: * Add / Fix the insert_str_record method for type inference (sends TSInsertStringRecord) * Add Support for python testcontainer with a specific IoTDB Container. * Improved the readme a bit

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[iotdb] 01/01: Improve Python Client: * Add / Fix the insert_str_record method for type inference (sends TSInsertStringRecord) * Add Support for python testcontainer with a specific IoTDB Container. * Improved the readme a bit

Posted by jf...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jfeinauer pushed a commit to branch feature/improve-py-client
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 468c36e468c3494aa953d701e10eeebcae6b6089
Author: julian <j....@pragmaticminds.de>
AuthorDate: Wed Mar 24 11:00:37 2021 +0100

    Improve Python Client:
    * Add / Fix the insert_str_record method for type inference (sends TSInsertStringRecord)
    * Add Support for python testcontainer with a specific IoTDB Container.
    * Improved the readme a bit
---
 client-py/pypi/README.md             | 21 ++++++++++++++++++++-
 client-py/src/iotdb/Session.py       | 13 ++++++++++---
 client-py/src/iotdb/TestContainer.py | 31 +++++++++++++++++++++++++++++++
 3 files changed, 61 insertions(+), 4 deletions(-)

diff --git a/client-py/pypi/README.md b/client-py/pypi/README.md
index dc7182c..257c1d8 100644
--- a/client-py/pypi/README.md
+++ b/client-py/pypi/README.md
@@ -70,4 +70,23 @@ session.open(False)
 zone = session.get_time_zone()
 session.close()
 
-```
\ No newline at end of file
+```
+
+## IoTDB Testcontainer
+
+The Test Support is based on the lib `testcontainers` (https://testcontainers-python.readthedocs.io/en/latest/index.html) which you need to install in your project if you want to use the feature.
+
+To start (and stop) an IoTDB Database in a Docker container simply do:
+```
+class MyTestCase(unittest.TestCase):
+
+    def test_something(self):
+        with IoTDBContainer() as c:
+            session = Session('localhost', c.get_exposed_port(6667), 'root', 'root')
+            session.open(False)
+            result = session.execute_query_statement("SHOW TIMESERIES")
+            print(result)
+            session.close()
+```
+
+by default it will load the image `apache/iotdb:latest`, if you want a specific version just pass it like e.g. `IoTDBContainer("apache/iotdb:0.10.0")` to get version `0.10.0` running.
\ No newline at end of file
diff --git a/client-py/src/iotdb/Session.py b/client-py/src/iotdb/Session.py
index 1d7a4a4..e371423 100644
--- a/client-py/src/iotdb/Session.py
+++ b/client-py/src/iotdb/Session.py
@@ -25,7 +25,7 @@ from .utils.IoTDBConstants import *
 from thrift.protocol import TBinaryProtocol, TCompactProtocol
 from thrift.transport import TSocket, TTransport
 
-from .thrift.rpc.TSIService import Client, TSCreateTimeseriesReq, TSInsertRecordReq, TSInsertTabletReq, \
+from .thrift.rpc.TSIService import Client, TSCreateTimeseriesReq, TSInsertRecordReq, TSInsertStringRecordReq, TSInsertTabletReq, \
     TSExecuteStatementReq, TSOpenSessionReq, TSCreateMultiTimeseriesReq, TSCloseSessionReq, TSInsertTabletsReq, TSInsertRecordsReq, \
     TSInsertRecordsOfOneDeviceReq
 from .thrift.rpc.ttypes import TSDeleteDataReq, TSProtocolVersion, TSSetTimeZoneReq
@@ -226,8 +226,8 @@ class Session(object):
     def insert_str_record(self, device_id, timestamp, measurements, string_values):
         """ special case for inserting one row of String (TEXT) value """
         data_types = [TSDataType.TEXT.value for _ in string_values]
-        request = self.gen_insert_record_req(device_id, timestamp, measurements, data_types, string_values)
-        status = self.__client.insertRecord(request)
+        request = self.gen_insert_str_record_req(device_id, timestamp, measurements, data_types, string_values)
+        status = self.__client.insertStringRecord(request)
         print("insert one record to device {} message: {}".format(device_id, status.message))
 
         return Session.verify_success(status)
@@ -316,6 +316,13 @@ class Session(object):
         values_in_bytes = Session.value_to_bytes(data_types, values)
         return TSInsertRecordReq(self.__session_id, device_id, measurements, values_in_bytes, timestamp)
 
+    def gen_insert_str_record_req(self, device_id, timestamp, measurements, data_types, values):
+        if (len(values) != len(data_types)) or (len(values) != len(measurements)):
+            print("length of data types does not equal to length of values!")
+            # could raise an error here.
+            return
+        return TSInsertStringRecordReq(self.__session_id, device_id, measurements, values, timestamp)
+
     def gen_insert_records_req(self, device_ids, times, measurements_lst, types_lst, values_lst):
         if (len(device_ids) != len(measurements_lst)) or (len(times) != len(types_lst)) or \
             (len(device_ids) != len(times)) or (len(times) != len(values_lst)):
diff --git a/client-py/src/iotdb/TestContainer.py b/client-py/src/iotdb/TestContainer.py
new file mode 100644
index 0000000..8230d6a
--- /dev/null
+++ b/client-py/src/iotdb/TestContainer.py
@@ -0,0 +1,31 @@
+from os import environ
+
+from testcontainers.core.container import DockerContainer
+from testcontainers.core.waiting_utils import wait_container_is_ready
+
+from iotdb.Session import Session
+
+
+class IoTDBContainer(DockerContainer):
+    IOTDB_USER = environ.get("IOTDB_USER", "root")
+    IOTDB_PASSWORD = environ.get("IOTDB_PASSWORD", "root")
+
+    def _configure(self):
+        pass
+
+    @wait_container_is_ready()
+    def _connect(self):
+        session = Session(self.get_container_host_ip(), self.get_exposed_port(6667), 'root', 'root')
+        session.open(False)
+        session.close()
+
+    def __init__(self, image="apache/iotdb:latest", **kwargs):
+        super(IoTDBContainer, self).__init__(image)
+        self.port_to_expose = 6667
+        self.with_exposed_ports(self.port_to_expose)
+
+    def start(self):
+        self._configure()
+        super().start()
+        self._connect()
+        return self
\ No newline at end of file