{"id":52178,"date":"2025-07-03T00:00:00","date_gmt":"2025-07-03T07:00:00","guid":{"rendered":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/blog\/python-client-v5-8\/"},"modified":"2025-07-03T00:00:00","modified_gmt":"2025-07-03T07:00:00","slug":"python-client-v5-8","status":"publish","type":"post","link":"https:\/\/griddb.net\/en\/blog\/python-client-v5-8\/","title":{"rendered":"Python Client v5.8 Changes &#038; Usage (Client is now based on Java!)"},"content":{"rendered":"<p>The GridDB Python client has been updated to now use the native GridDB Java interface with <a href=\"https:\/\/pypi.org\/project\/jpype1\/\">JPype<\/a> and <a href=\"https:\/\/pypi.org\/project\/pyarrow\/\">Apache Arrow<\/a>. Prior to this release, the python client relied on the c_client, and translated some of those commands with swig and other tools.<\/p>\n<p>The main benefit of committing to this change in underlying technology is being able to query GridDB and get back an Apache Arrow recordbatch object in return. We will go over how this change can directly affect your python workflows with a concrete example later on in this article.<\/p>\n<p>Another benefit is how SQL is now handled. With the c_client as the base, you could query the database only using TQL, but not SQL, meaning that certain partitioned tables were simply not accessible to your python client. There were workarounds, for example: <a href=\"https:\/\/griddb.net\/en\/blog\/pandas-with-python-griddb-sql-queries\/\">Pandas with Python GridDB SQL Queries<\/a>, but now with this new client, this sort of thing will work out of the box.<\/p>\n<p>So with that out of the way, let&#8217;s see how we can install the new GridDB Python Client and explore some of the changes in this new version<\/p>\n<h2>Installation And Prereqs<\/h2>\n<p>To install, as explained briefly above, you will need to have Java installed and set to your environment variable <code>JAVA_HOME<\/code>. You will also need <code>maven<\/code> and <code>python3.12<\/code><\/p>\n<p>Here is how I installed these packages and set the Java home on Ubuntu 22.04:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$ sudo apt install maven python3.12 default-jdk\n$ export JAVA_HOME=\/usr\/lib\/jvm\/java-11-openjdk-amd64<\/code><\/pre>\n<\/div>\n<h3>Installation<\/h3>\n<p>To grab the source code of the python client, navigate to its <a href=\"https:\/\/github.com\/griddb\/python_client\">github<\/a> page and clone the repo. Once cloned, we can run a maven install to build our apache library and then install the python client.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">git clone https:\/\/github.com\/griddb\/python_client.git\ncd python_client\/java\nmvn install\ncd ..\ncd python\npython3.12 -m pip install .\ncd .. #this puts you back in the root directory of python_client<\/code><\/pre>\n<\/div>\n<h3>Jar Files and Your Environment Variables<\/h3>\n<p>On top of having the JAVA HOME set and having Java installed, there are a couple of <code>.jar<\/code> files you will need to be in your <code>CLASSPATH<\/code> as well. Specifically we need <code>pyarrow<\/code>, <code>gridstore<\/code> and in some cases, <code>py-memory-netty<\/code>. Two of these three we can just download generic versions from the maven repository, but Apache Arrow will rely on a modified version which we built in the previous step. So let&#8217;s download and set these jar files.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$ mkdir lib && cd lib\n$ curl -L -o gridstore.jar https:\/\/repo1.maven.org\/maven2\/com\/github\/griddb\/gridstore\/5.8.0\/gridstore-5.8.0.jar\n$ curl -L -o arrow-memory-netty.jar https:\/\/repo1.maven.org\/maven2\/org\/apache\/arrow\/arrow-memory-netty\/18.3.0\/arrow-memory-netty-18.3.0.jar\n$ cp ..\/java\/target\/gridstore-arrow-5.8.0.jar gridstore-arrow.jar\n$ export CLASSPATH=$CLASSPATH:.\/gridstore.jar:.\/gridstore-arrow.jar:.\/arrow-memory-netty.jar<\/code><\/pre>\n<\/div>\n<p>If you are unsure if your CLASSPATH is set, you can always run an echo:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$ echo $CLASSPATH\n:.\/gridstore.jar:.\/gridstore-arrow.jar:.\/arrow-memory-netty.jar<\/code><\/pre>\n<\/div>\n<p>With this set in your CLASSPATH, you can start your python3 griddb scripts without explicity setting the classpath options when starting the JVM at the top of the file. If you don&#8217;t set the CLASSPATH, you can use the option like the sample code does:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">import jpype\n\n# If no CLASSPATH Set in the environment, you can force the JVM to start with these jars explicitly\njpype.startJVM(classpath=[\".\/gridstore.jar\", \".\/gridstore-arrow.jar\", \".\/arrow-memory-netty.jar\"])\nimport griddb_python as griddb\nimport sys<\/code><\/pre>\n<\/div>\n<p>or if you set the CLASSPATH and make this permanent (for example, editing your <code>.bashrc file<\/code>), you can get away with not importing jpype at all as the modified pyarrow will do it for you.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">\n# No jpype set here; still works\nimport griddb_python as griddb\nimport sys<\/code><\/pre>\n<\/div>\n<h2>Running Samples<\/h2>\n<p>To ensure everything is working properly, we should try running the sample code. Navigate to the sample dir, make some changes, and then run!<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\"># from the root of this python client repo\n$ cd sample<\/code><\/pre>\n<\/div>\n<p>We will need to change the connection details as GridDB CE runs mostly in FIXED_LIST mode now, meaning we need a notification member, not a host\/port combo:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">try:\n    #Get GridStore object\n    # Changed here to notification_member vs port & address\n    gridstore = factory.get_store(notification_member=argv[1], cluster_name=argv[2], username=argv[3], password=argv[4])<\/code><\/pre>\n<\/div>\n<p>And depending on you have your CLASSPATH variables set, you can either add <code>arrow-memory-netty<\/code> to your jypype start jvm method, or set your classpath as explained. The code should now run just fine:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">python_client\/sample$ python3.12 sample1.py 127.0.0.1:10001 myCluster admin admin\nPerson: name=name02 status=False count=2 lob=[65, 66, 67, 68, 69, 70, 71, 72, 73, 74]<\/code><\/pre>\n<\/div>\n<h2>API Differences &amp; Usage<\/h2>\n<p>The README for the Python client page explains what features are still currently missing (when compared to the previous v.0.8.5):<\/p>\n<pre><code>- Array type for GridDB\n- Timeseries-specific function\n- Implicit data type conversion\n<\/code><\/pre>\n<p>But there is also some functionality that is gained with this move:<\/p>\n<pre><code>- Compsite RowKey, Composite Index GEOMETRY type and TIMESTAMP(micro\/nano-second) type \n- Put\/Get\/Fetch with Apache Arrow \n- Operations for Partitioning table\n<\/code><\/pre>\n<h3>Using SQL<\/h3>\n<p>These new features basically come from the ability to use Java and then by extension JDBC and SQL.<\/p>\n<p>To use SQL, you can simply add the <a href=\"https:\/\/github.com\/griddb\/jdbc\">GridDB JDBC jar<\/a> to your <code>CLASSPATH<\/code> (or jvm start options). From there, you can use SQL and use them on partition tables. Taken from the samples, here&#8217;s what SQL can look like:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">import jpype\nimport jpype.dbapi2\njpype.startJVM(classpath=[\".\/gridstore.jar\", \".\/gridstore-arrow.jar\", \".\/gridstore-jdbc.jar\"])\nimport griddb_python as griddb\nimport sys\n\n### SQL create table\/insert\n\nurl = \"jdbc:gs:\/\/127.0.0.1:20001\/myCluster\/public\"\nconn = jpype.dbapi2.connect(url, driver=\"com.toshiba.mwcloud.gs.sql.Driver\",\n    driver_args={\"user\":\"admin\", \"password\":\"admin\"})\n\ncurs = conn.cursor()\n\ncurs.execute(\"DROP TABLE IF EXISTS Sample\")\ncurs.execute(\"CREATE TABLE IF NOT EXISTS Sample ( id integer PRIMARY KEY, value string )\")\nprint('SQL Create Table name=Sample')\n\ncurs.execute(\"INSERT INTO Sample values (0, 'test0'),(1, 'test1'),(2, 'test2'),(3, 'test3'),(4, 'test4')\")\nprint('SQL Insert')<\/code><\/pre>\n<\/div>\n<p>For the most part, this stuff is the same as before as we could always start up the jpype jvm with python and run JDBC. What is truly new is using Apache Arrow.<\/p>\n<h3>Using Apache Arrow with GridDB\/Python\/Nodejs<\/h3>\n<p>Part of what makes Arrow so useful in the modern era is its ability to &#8220;[allow] for zero-copy reads and fast data access and interchange without serialization overhead between these languages and systems.&#8221;(https:\/\/en.wikipedia.org\/wiki\/Apache_Arrow). To showcase this, we will create a python script to generate 10000 rows of &#8216;random&#8217; data, then we will query the result directly in an <a href=\"https:\/\/arrow.apache.org\/docs\/python\/generated\/pyarrow.RecordBatch.html\">Arrow RecordBatch object<\/a>, and once that obj exists, we will stream it over tcp (without serialzing\/deserializing) directly over to nodejs (so called Zero-Copying).<\/p>\n<p>First, let&#8217;s generate 10000 rows of data. We will create a timeseries container with &#8216;random&#8217; data in all of the columns.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">from datetime import datetime, timezone, timedelta\nimport griddb_python as griddb\nimport sys\nimport pandas as pd\nimport pyarrow as pa\nimport uuid\nimport random\nimport socket\nimport warnings\nwarnings.filterwarnings('ignore')\n\n\ndef generate_random_timestamps(start_date_str, num_timestamps, min_interval_minutes=5, max_interval_minutes=30):\n    date_format = \"%Y-%m-%dT%H:%M:%S\"\n    \n    current_time = datetime.fromisoformat(start_date_str.replace(\"Z\", \"\")).replace(tzinfo=timezone.utc)\n    \n    timestamp_list = []\n\n    for _ in range(num_timestamps):\n        timestamp_str = current_time.strftime(date_format) + \".000Z\"\n        timestamp_list.append(timestamp_str)\n\n        random_minutes = random.randint(min_interval_minutes, max_interval_minutes)\n        current_time += timedelta(minutes=random_minutes)\n\n    return timestamp_list\n\n\nstart_point = \"2024-12-01T10:00:00.000Z\"\nnumber_of_stamps = 10000     \nmin_interval = 5           \nmax_interval = 20          \n\ngenerated_datelist = generate_random_timestamps(\n    start_point, \n    number_of_stamps, \n    min_interval, \n    max_interval\n)\n\nfactory = griddb.StoreFactory.get_instance()\n\ngridstore = factory.get_store(\n    notification_member=\"127.0.0.1:10001\",\n    cluster_name=\"myCluster\",\n    username=\"admin\",\n    password=\"admin\"\n)\n\ncol = gridstore.get_container(\"col01\")\n\nra = griddb.RootAllocator(sys.maxsize)\n\nblob = bytearray([65, 66, 67, 68, 69, 70, 71, 72, 73, 74])\nconInfo = griddb.ContainerInfo(\"col01\",\n    [[\"ts\", griddb.Type.TIMESTAMP],\n    [\"name\", griddb.Type.STRING],\n    [\"status\", griddb.Type.BOOL],\n    [\"count\", griddb.Type.LONG],\n    [\"lob\", griddb.Type.BLOB]],\n    griddb.ContainerType.TIME_SERIES, True)\n\ni=0\nrows=[]\nwhile i < 10000:\n    rows.append([datetime.strptime(generated_datelist[i], \"%Y-%m-%dT%H:%M:%S.%f%z\"),str(uuid.uuid1()), False, random.randint(0, 1048576), blob])\n    i=i+1<\/code><\/pre>\n<\/div>\n<p>Next let's insert with multiput. First we'll format the list of rows into a dataframe. Then we'll convert the dataframe into a recordbatch and then use multiput to insert the batch into GridDB:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">df = pd.DataFrame(rows, columns=[\"ts\", \"name\", \"status\", \"count\", \"lob\"])\ncol = gridstore.put_container(conInfo)\nrb = pa.record_batch(df)\ncol.multi_put(rb, ra)<\/code><\/pre>\n<\/div>\n<p>Now that our data is inside GridDB, let's query it (this is for the sake of education, obviously this makes no sense in the 'real world').<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">col = gridstore.get_container(\"col01\")\nq = col.query(\"select *\")\nq.set_fetch_options(root_allocator=ra)\nrs = q.fetch()\nresult = []\nrb = rs.next_record_batch() #gets all of the rows as a recordbatch obj<\/code><\/pre>\n<\/div>\n<p>And now finally, let's stream our record batch over to some other programming environment to showcase Apache Arrow's supreme flexibility. We will use nodejs as the consumer here.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">#stream our rows through socket\n\nHOST = '127.0.0.1'\nPORT = 2828\n\nwith socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:\n    server_socket.bind((HOST, PORT))\n    server_socket.listen(1)\n    print(f\"Python producer listening on {HOST}:{PORT}\")\n    conn, addr = server_socket.accept()\n    print(f\"Connected by {addr}\")\n\n    with conn:\n        with conn.makefile(mode='wb') as f:\n            # Use the file-like object as the sink for the stream writer\n            with pa.ipc.new_stream(f, rb.schema) as writer:\n                writer.write_batch(rb)<\/code><\/pre>\n<\/div>\n<p>Run the python script and it will create the container, add the rows of data, query those rows of data, and then start a server which is listening for a consumer to connect to it, which will then send all of the rows to the consumer.<\/p>\n<p>Nodejs will now connect to our producer and print out the records<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const net = require('net');\nconst { RecordBatchReader } = require('apache-arrow');\n\nconst HOST = '127.0.0.1';\n\/\/ Ensure this port matches your Python producer's port\nconst PORT = 2828;\n\nconst client = new net.Socket();\n\nclient.connect(PORT, HOST, async () => {\n    console.log(`Connected to Python producer at ${HOST}:${PORT}`);\n\n    try {\n        const reader = await RecordBatchReader.from(client);\n\n        let schemaPrinted = false;\n\n        for await (const recordBatch of reader) {\n            if (!schemaPrinted) {\n                console.log(\"Successfully parsed schema from stream.\");\n                console.log(`Schema:`, reader.schema.fields.map(f => `${f.name}: ${f.type}`).join(', '));\n                console.log(\"--- Processing data batches ---\");\n                schemaPrinted = true;\n            }\n\n            \/\/ Convert the record batch to a more familiar JavaScript object format\n            const data = recordBatch.toArray().map(row => row.toJSON());\n            console.log(\"Received data batch:\", data);\n        }\n\n        console.log(\"-------------------------------\");\n        console.log(\"Stream finished.\");\n\n    } catch (error) {\n        console.error(\"Error processing Arrow stream:\", error);\n    }\n});\n\nclient.on('close', () => {\n    console.log('Connection closed');\n});\n\nclient.on('error', (err) => {\n    console.error('Connection error:', err.message);\n});<\/code><\/pre>\n<\/div>\n<p>Run this nodejs script like so:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$ npm install\n$ node consumer.js\n\nConnected to Python producer at 127.0.0.1:2828\nSuccessfully parsed schema from stream.\nSchema: ts: Timestamp<MILLISECOND>, name: Utf8, status: Bool, count: Int64, lob: Binary\n--- Processing data batches ---\nReceived data batch: [\n  {\n    ts: 1733047200000,\n    name: '65d16ce6-55d3-11f0-8070-8bbd0177d9e6',\n    status: false,\n    count: 820633n,\n    lob: Uint8Array(10) [\n      65, 66, 67, 68, 69,\n      70, 71, 72, 73, 74\n    ]\n  },\n  {\n    ts: 1733047500000,\n    name: '65d16ce7-55d3-11f0-8070-8bbd0177d9e6',\n    status: false,\n    count: 931837n,\n    lob: Uint8Array(10) [\n      65, 66, 67, 68, 69,\n      70, 71, 72, 73, 74\n    ]\n  },\n\n  ....cutoff<\/code><\/pre>\n<\/div>\n<h2>Conclusion<\/h2>\n<p>And with that, we have successfully showcased the new GridDB Python client!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The GridDB Python client has been updated to now use the native GridDB Java interface with JPype and Apache Arrow. Prior to this release, the python client relied on the c_client, and translated some of those commands with swig and other tools. The main benefit of committing to this change in underlying technology is being [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":52179,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-52178","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Python Client v5.8 Changes &amp; Usage (Client is now based on Java!) | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"The GridDB Python client has been updated to now use the native GridDB Java interface with JPype and Apache Arrow. Prior to this release, the python\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python Client v5.8 Changes &amp; Usage (Client is now based on Java!) | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"The GridDB Python client has been updated to now use the native GridDB Java interface with JPype and Apache Arrow. Prior to this release, the python\" \/>\n<meta property=\"og:url\" content=\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/\" \/>\n<meta property=\"og:site_name\" content=\"GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/griddbcommunity\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-03T07:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/12\/python-blog.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1160\" \/>\n\t<meta property=\"og:image:height\" content=\"653\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Israel\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:site\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Israel\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/\"},\"author\":{\"name\":\"Israel\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/c8a430e7156a9e10af73b1fbb46c2740\"},\"headline\":\"Python Client v5.8 Changes &#038; Usage (Client is now based on Java!)\",\"datePublished\":\"2025-07-03T07:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/\"},\"wordCount\":952,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2025\/12\/python-blog.png\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/\",\"url\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/\",\"name\":\"Python Client v5.8 Changes & Usage (Client is now based on Java!) | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2025\/12\/python-blog.png\",\"datePublished\":\"2025-07-03T07:00:00+00:00\",\"description\":\"The GridDB Python client has been updated to now use the native GridDB Java interface with JPype and Apache Arrow. Prior to this release, the python\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2025\/12\/python-blog.png\",\"contentUrl\":\"\/wp-content\/uploads\/2025\/12\/python-blog.png\",\"width\":1160,\"height\":653},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website\",\"url\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL\",\"publisher\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/griddbcommunity\/\",\"https:\/\/x.com\/GridDBCommunity\",\"https:\/\/www.linkedin.com\/company\/griddb-by-toshiba\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/c8a430e7156a9e10af73b1fbb46c2740\",\"name\":\"Israel\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4df8cfc155402a2928d11f80b0220037b8bd26c4f1b19c4598d826e0306e6307?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4df8cfc155402a2928d11f80b0220037b8bd26c4f1b19c4598d826e0306e6307?s=96&d=mm&r=g\",\"caption\":\"Israel\"},\"url\":\"https:\/\/griddb.net\/en\/author\/israel\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Python Client v5.8 Changes & Usage (Client is now based on Java!) | GridDB: Open Source Time Series Database for IoT","description":"The GridDB Python client has been updated to now use the native GridDB Java interface with JPype and Apache Arrow. Prior to this release, the python","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/","og_locale":"en_US","og_type":"article","og_title":"Python Client v5.8 Changes & Usage (Client is now based on Java!) | GridDB: Open Source Time Series Database for IoT","og_description":"The GridDB Python client has been updated to now use the native GridDB Java interface with JPype and Apache Arrow. Prior to this release, the python","og_url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2025-07-03T07:00:00+00:00","og_image":[{"width":1160,"height":653,"url":"https:\/\/griddb.net\/wp-content\/uploads\/2025\/12\/python-blog.png","type":"image\/png"}],"author":"Israel","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"Israel","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#article","isPartOf":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/"},"author":{"name":"Israel","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/c8a430e7156a9e10af73b1fbb46c2740"},"headline":"Python Client v5.8 Changes &#038; Usage (Client is now based on Java!)","datePublished":"2025-07-03T07:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/"},"wordCount":952,"commentCount":0,"publisher":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization"},"image":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2025\/12\/python-blog.png","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/","url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/","name":"Python Client v5.8 Changes & Usage (Client is now based on Java!) | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#primaryimage"},"image":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2025\/12\/python-blog.png","datePublished":"2025-07-03T07:00:00+00:00","description":"The GridDB Python client has been updated to now use the native GridDB Java interface with JPype and Apache Arrow. Prior to this release, the python","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/python-client-v5-8\/#primaryimage","url":"\/wp-content\/uploads\/2025\/12\/python-blog.png","contentUrl":"\/wp-content\/uploads\/2025\/12\/python-blog.png","width":1160,"height":653},{"@type":"WebSite","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website","url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/","name":"GridDB: Open Source Time Series Database for IoT","description":"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL","publisher":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization","name":"Fixstars","url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/","url":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/griddbcommunity\/","https:\/\/x.com\/GridDBCommunity","https:\/\/www.linkedin.com\/company\/griddb-by-toshiba"]},{"@type":"Person","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/c8a430e7156a9e10af73b1fbb46c2740","name":"Israel","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4df8cfc155402a2928d11f80b0220037b8bd26c4f1b19c4598d826e0306e6307?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4df8cfc155402a2928d11f80b0220037b8bd26c4f1b19c4598d826e0306e6307?s=96&d=mm&r=g","caption":"Israel"},"url":"https:\/\/griddb.net\/en\/author\/israel\/"}]}},"_links":{"self":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/52178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/comments?post=52178"}],"version-history":[{"count":0,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/52178\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media\/52179"}],"wp:attachment":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media?parent=52178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/categories?post=52178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/tags?post=52178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}