Py2neo is a client library and toolkit for working with Neo4j from within Python

Overview

Py2neo

PyPI version PyPI Downloads License Coverage Status

Py2neo is a client library and toolkit for working with Neo4j from within Python applications. The library supports both Bolt and HTTP and provides a high level API, an OGM, admin tools, a Cypher lexer for Pygments, and many other bells and whistles.

Command line tooling has been removed from the library in py2neo 2021.2. This functionality now exists in the separate ipy2neo project.

As of version 2021.1, py2neo contains full support for routing, as exposed by a Neo4j cluster. This can be enabled using a neo4j://... URI or by passing routing=True to a Graph constructor.

Installation & Compatibility

To install the latest release of py2neo, simply use:

$ pip install py2neo

The following versions of Python and Neo4j (all editions) are supported:

Neo4j Python 3.5+ Python 2.7
4.3 GitHub workflow status for tests against Neo4j 4.3 using py35+ GitHub workflow status for tests against Neo4j 4.3 using py27
4.2 GitHub workflow status for tests against Neo4j 4.2 using py35+ GitHub workflow status for tests against Neo4j 4.2 using py27
4.1 GitHub workflow status for tests against Neo4j 4.1 using py35+ GitHub workflow status for tests against Neo4j 4.1 using py27
4.0 GitHub workflow status for tests against Neo4j 4.0 using py35+ GitHub workflow status for tests against Neo4j 4.0 using py27
3.5 GitHub workflow status for tests against Neo4j 3.5 using py35+ GitHub workflow status for tests against Neo4j 3.5 using py27
3.4 GitHub workflow status for tests against Neo4j 3.4 using py35+ GitHub workflow status for tests against Neo4j 3.4 using py27

Note that py2neo is developed and tested under Linux using standard CPython distributions. While other operating systems and Python distributions may work, support for these is not available.

Quick Example

To run a query against a local database is straightforward:

>>> from py2neo import Graph
>>> graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
>>> graph.run("UNWIND range(1, 3) AS n RETURN n, n * n as n_sq")
   n | n_sq
-----|------
   1 |    1
   2 |    4
   3 |    9

Releases & Versioning

As of 2020, py2neo has switched to Calendar Versioning, using a scheme of YYYY.N.M. Here, N is an incrementing zero-based number for each year, and M is a revision within that version (also zero-based).

No compatibility guarantees are given between versions, but as a general rule, a change in M should require little-to-no work within client applications, whereas a change in N may require some work. A change to the year is likely to require a more significant amount of work to upgrade.

Note that py2neo is developed on a rolling basis, so patches are not made to old versions. Users will instead need to install the latest release to adopt bug fixes.

More

For more information, read the handbook.

Issues
  • Known bug in WeakValueDictionary's setdefault() causes issues in Node,Rel and Relationship caches in multithreaded environments

    Known bug in WeakValueDictionary's setdefault() causes issues in Node,Rel and Relationship caches in multithreaded environments

    WeakValueDictionary.setdefault() and WeakValueDictionary.pop() will sometimes return None in multithreaded environments, as explained here http://bugs.python.org/issue19542. The patch is pending review.

    I've been able to reproduce the problem by running the test case x.py that's linked in the bug report using both python 2.7.9 and python 3.4.3.

    I have also encountered the problem during development of a Flask app that uses py2neo. This app is run on Apache using mod_wsgi-express (prefork, 1 process, 5 threads).

    Anyhow, since Node.cache, Rel.cache, and Relationship.cache all inherit from WeakValueDictionary and have methods that call setdefault(), I've been seeing NoneType errors in my Flask app.

    For instance, this snippet in Rel#hydrate() in core.py:

            if inst is None:
                new_inst = cls()
                new_inst.__stale.update({"properties"})
                inst = cls.cache.setdefault(self, new_inst)
    
            cls.cache[self] = inst
    

    Will intermittently produce:

        File "/Users/fallonchen/.virtualenvs/ul06/lib/python2.7/site-packages/py2neo/core.py", line 912, in match
        for result in results:
        File "/Users/fallonchen/.virtualenvs/ul06/lib/python2.7/site-packages/py2neo/cypher/core.py", line 453, in next
        return self.__next__()
        File "/Users/fallonchen/.virtualenvs/ul06/lib/python2.7/site-packages/py2neo/cypher/core.py", line 450, in __next__
        return next(self.__response_item)
        File "/Users/fallonchen/.virtualenvs/ul06/lib/python2.7/site-packages/py2neo/cypher/core.py", line 443, in __response_iterator
        yield producer.produce(self.graph.hydrate(assembled(record_data)))
        File "/Users/fallonchen/.virtualenvs/ul06/lib/python2.7/site-packages/py2neo/core.py", line 839, in hydrate
        return type(data)(map(self.hydrate, data))
        File "/Users/fallonchen/.virtualenvs/ul06/lib/python2.7/site-packages/py2neo/core.py", line 806, in hydrate
        return Relationship.hydrate(data)
        File "/Users/fallonchen/.virtualenvs/ul06/lib/python2.7/site-packages/py2neo/core.py", line 2421, in hydrate
        Rel.hydrate(data),
        File "/Users/fallonchen/.virtualenvs/ul06/lib/python2.7/site-packages/py2neo/core.py", line 1769, in hydrate
        cls.cache[self] = inst
        File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/weakref.py", line 103, in __setitem__
        self.data[key] = KeyedRef(value, self._remove, key)
        File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/weakref.py", line 267, in __new__
        self = ref.__new__(type, ob, callback)
        TypeError: cannot create weak reference to 'NoneType' object
    
    

    I've found that you can get around the problem by replacing setdefault() with:

            if self not in cls.cache:
                 cls.cache[self] = new_inst
             inst = cls.cache[self]
    

    Is this a good approach? I haven't looked too deeply into whether or not pop() is called, but I assume that it would also have to be patched.

    bug 
    opened by fallonchen 26
  • SyntaxError: The old parameter syntax `{param}` is no longer supported

    SyntaxError: The old parameter syntax `{param}` is no longer supported

    Using neo4j 4.0.0

    Using py2neo v4

    g.nodes.match(U, _id=3125349375).first()

    yields:

    ClientError: SyntaxError: The old parameter syntax `{param}` is no longer supported. 
    Please use `$param` instead (line 1, column 30 (offset: 29))
    "MATCH (_:USER) WHERE _._id = {1} RETURN _"
    
    opened by msramalho 18
  • Node object has no attribute __metadata__

    Node object has no attribute __metadata__

    @nigelsmall - Using version 1.6.4, neo4j 2.1.3 and python 3.3, when I try the following

    graph_db = neo4j.GraphDatabaseService("http://localhost:7474/db/data/")
    n = graph_db.node(100)
    n["username"]="Nigel"
    

    I get:

    AttributeError("'Node' object has no attribute 'metadata'",)

    could this be a bug with using a later version of Neo4j?

    opened by gmjordan 16
  • On development of this project

    On development of this project

    It's obvious that you are still working on this project @technige, but it's kind of disappointing that are not many responses to the open issues. Perhaps many of the issues can be closed as simple misunderstandings. For myself, I would like to contribute but I need some guidance. I also learn a lot about a project by responses and activity in issues. I think more activity in the issues could help reduce the bus factor and be an overall benefit to the project. This is just a suggestion, as I enjoy working with this project and want to see it continue to improve

    opened by wgwz 15
  • Individual status codes in http batch response

    Individual status codes in http batch response

    Hi Nigel,

    We have been porting neomodel to py2neo 1.6, we have come across one issue. The individual http response status codes seem to be no longer accessible in a batch response.

    I am aware this was never part of your public API, however it was used internally by neomodel to aid it safely simulating the create_or_fail index feature on neo4j versions where its not available (such as 1.8 used on heroku).

    Setting a key, value in an index returns 200 if it already existed and 201 if its new entry. As these codes are no longer available in py2neo / httpstream we can't capture and report this condition: https://github.com/robinedwards/neomodel/blob/master/neomodel/exception.py#L13

    Do you know if theres any way I can monkey patch / subclass the current batch system to return them?

    bug 
    opened by robinedwards 14
  • py2neo.wiring.WireError: Broken

    py2neo.wiring.WireError: Broken

    When i run the program in a timed task, this problem occurred. I use flask_apscheduler and py2neo, hoping to update the data in an hour. But this error will happen every once in a while. I don't know how this error is caused. Who knows can tell me what is going on. Thank you very much!

    undiagnosable third-party disconnections 
    opened by zhangyukuo 13
  • 1.6 performance vs 1.5

    1.6 performance vs 1.5

    I'm aware that 1.6 is not yet final but I have been testing it in order to use labels and the new schema indexes in a project I am working on. In this project batches of 20-1000 statements are sent and tests are taking approx. 14 times longer on 1.6 than on 1.5, even without assigning any labels (straight swap of the library with same app code). It seems as though there is a delay between streamed requests ending and starting. Is this something you are aware of, if so then cool, but I just wanted to point out my findings in case not.

    opened by millar 12
  • Getting 'OverflowError: mktime argument out of range' while importing the database module from latest version of py2neo

    Getting 'OverflowError: mktime argument out of range' while importing the database module from latest version of py2neo

    Hello All, Initially I was using a py2neo's version 2021.1.5 within my project and the database module was getting successfully imported in the code. But, when I have updated the py2neo version to the latest one i.e. 2021.2.0 and then I was trying to import the database module from the py2neo I was getting an OverFlow error mentioning 'OverflowError: mktime argument out of range'. May I know the reason for the same ? Why the database module was getting successfully imported with the older version of py2neo? Thank you in advance.

    bug no windows maintainer 
    opened by psomesh94 11
  • py2neo has a version conflict in the list of requirements

    py2neo has a version conflict in the list of requirements

    I had an issue while installing a package of mine (pyramid application), which depended on py2neo.

    Issue:

    in py2neo setup.py file we have: prompt_toolkit==1.0.15

    however, py2neo also depends on (found in setup.py): jupyter_console

    in jupyter_console setup.py file we have:

    prompt_toolkit>=2.0.0,<2.1.0

    This can lead to potential conflict, which will not be explicitly shown when you install py2neo. However, when you use something like pyramid, which utilizes pkg_resources, it can lead to: pkg_resources.ContextualVersionConflict

    opened by nikist97 11
  • OGM request: provide more control when saving/loading objects

    OGM request: provide more control when saving/loading objects

    The OGM would be more useful if some hook would be provided so that the user has more control on how objects are saved and loaded.

    Example use case: I'd like to save an object and have the object's class name as a label. Since the store.save will only store the object's attrs as node properties I have to resort to 1) save object 2) reload object 3) set object.node.labels. 4) save object again. Yuck.

    PS1 the store.save method seems to use a deprecated function set_properties. PS2 it seems that passing a newly created node (see use case above; I wanted to pass the label) as a kwarg in the store.save(obj, node=mynewnode) does not work. I get a 500 server error. Did not explore further.

    opened by mjmare 11
  • Upgrading to Neo4j 2.1.7 breaks the test suite

    Upgrading to Neo4j 2.1.7 breaks the test suite

    For some reason tests are broken with Neo4j 2.1.7, even though they are passing with Neo4j 2.1.6 and 2.2.0-M03.

    Looks related to Cypher transactions not returning expected uris, but I don't see any reasons for this in Neo4j release notes.

    If I can help with this, please give me some hint.

    opened by jlirochon 11
  • IndexError, possibly a timeout problem

    IndexError, possibly a timeout problem

    This happens randomly to big write queries I submit, with no way of predicting which query will fail.

    Traceback (most recent call last):
      File "/tmp/pycharm_project_3/weaveio/graph.py", line 103, in _execute
        return self.neograph.auto(readonly=not self.write_allowed).run(cypher, parameters=parameters)
      File "/home/sread/miniconda2/envs/weaveio/lib/python3.7/site-packages/py2neo/database.py", line 980, in run
        readonly=self.readonly)
      File "/home/sread/miniconda2/envs/weaveio/lib/python3.7/site-packages/py2neo/client/__init__.py", line 1343, in auto_run
        cx.pull(result, n=pull)
      File "/home/sread/miniconda2/envs/weaveio/lib/python3.7/site-packages/py2neo/client/bolt.py", line 943, in pull
        self._sync(response)
      File "/home/sread/miniconda2/envs/weaveio/lib/python3.7/site-packages/py2neo/client/bolt.py", line 747, in _sync
        self._wait(response)
      File "/home/sread/miniconda2/envs/weaveio/lib/python3.7/site-packages/py2neo/client/bolt.py", line 742, in _wait
        self._fetch()
      File "/home/sread/miniconda2/envs/weaveio/lib/python3.7/site-packages/py2neo/client/bolt.py", line 717, in _fetch
        tag, fields = self.read_message()
      File "/home/sread/miniconda2/envs/weaveio/lib/python3.7/site-packages/py2neo/client/bolt.py", line 644, in read_message
        tag, fields = self._reader.read_message()
      File "/home/sread/miniconda2/envs/weaveio/lib/python3.7/site-packages/py2neo/client/bolt.py", line 96, in read_message
        _, n = divmod(message[0], 0x10)
    IndexError: index out of range
    

    referenced in #934

    opened by philastrophist 0
  • Fastest bulk merge via Threads

    Fastest bulk merge via Threads

    Hello Team! I'm exploring the features neo4j several months. I use dockerized Neo4j comunity version: Browser version: [4.2.6], Server version: [4.1.9] and py2neo==2021.2.3.

    There is a problem in importing a large number of data, about 100-500k rows.

    I wrote a wrapper for the merge_relationships (py2neo -> bulk operations), the code below. Actually, he breaks the dataset into chunks and via threads sends them to merge.

    Problem: the relations between the nodes are lost, the nodes of 100% exist! (did not clutter up the code about the nodes).

    Also, if you merge nodes through threads (same code via py2neo.bulk.merge_nodes instead merge_relationships), there make duplicates of Activity nodes, BUT this doesn't generate duplicates in Organization nodes - very strange behavior.

    Code example:

    from py2neo import Graph
    from py2neo.bulk import merge_relationships
    
    from concurrent.futures import ThreadPoolExecutor
    
    
    MAX_WORKERS = 10
    
    graph = Graph("http://neo4j:[email protected]:7474")
    
    
    def batcher(iterable, n=1):
        l = len(iterable)
        for ndx in range(0, l, n):
            yield iterable[ndx:min(ndx + n, l)]
    
    
    def upload_relations(graph, dataset):
        with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
            for batch in batcher(dataset.relationships, dataset.batch_size):
                executor.submit(
                    merge_relationships,
                    graph.auto(),
                    batch,
                    dataset.rel_type,
                    (tuple(dataset.start_node_labels), *dataset.fixed_order_start_node_properties), # start_node_key
                    (tuple(dataset.end_node_labels), *dataset.fixed_order_end_node_properties) # end_node_key
                )
    
    
    class DataSet:
        batch_size = 1000
        rel_type = "HAS_ACTIVITY"
    
        start_node_labels = ['Organization']
        fixed_order_start_node_properties = ('index',)
    
        end_node_labels = ['Activity']
        fixed_order_end_node_properties = ('name',)
    
        relationships = [
            ('1810003938', {}, 'Type1'),
            ('1710000665', {}, 'Type2'),
            ('1810002242', {}, 'Type3'),
            ('0310006089', {}, 'Type4'),
            ('0310005915', {}, 'Type5'),
            ('1810002325', {}, 'Type6'),
            ('5710001175', {}, 'Type7'),
            ('3610002514', {}, 'Type8'),
            ('3910000839', {}, 'Type9'),
            ...
        ]
    
    dataset = DataSet()
    
    upload_relations(graph, dataset)
    
    opened by urusd 0
  • Incorrect hash for bound nodes with identity=0

    Incorrect hash for bound nodes with identity=0

    Expected behavior

    For bound nodes with identity=0, hash computation should be based on the graph.service, graph.name and identity attributes.

    Actual behavior

    If identity=0 for a bound node, then the if statement on line 691 is equivalent to the snippet below and always evaluates to False:

    if self.graph and 0:
        ...
    

    which means that the hash is computed based on the Python object's identity.

    Steps to reproduce the problem

    You would need a fresh Neo4j instance, or to query a node with <id>: 0, or to set node's identity to 0 manually:

    from py2neo import Graph, Node
    
    g = Graph()
    n = Node()
    g.create(n)  # node is bound now
    n.identity = 0  # re-write identity for demonstration
    h = hash(n)
    
    h_unbound = hash(id(n))
    print(h == h_unbound)
    
    h_bound = hash(n.graph.service) ^ hash(n.graph.name) ^ hash(n.identity)
    print(h == h_bound)
    

    Proposed solution

    Replace the line 691 with

    if self.graph and (self.identity is not None):
        ...
    
    opened by atsysin 0
  • "ConnectionResetError: [Errno 104] Connection reset by peer" after idle connection

    I established a long connection between client and neo4j using py2neo 2021.1.5, and raise this error after idle connection. error infos: Traceback (most recent call last): File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/wiring.py", line 117, in read received = self.__socket.recv(requested) ConnectionResetError: [Errno 104] Connection reset by peer

    During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/client/bolt.py", line 87, in read_message hi, lo = self.wire.read(2) File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/wiring.py", line 119, in read self.__mark_broken("Wire broken") File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/wiring.py", line 222, in __mark_broken bytes_received=self.__bytes_received) py2neo.wiring.BrokenWireError: Wire broken after 0.0s idle (3514 bytes sent, 6855 bytes received)

    The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/opt/bin/knowledge_graph/routes/graph/views.py", line 168, in click_node datas = og.clicknode(nodeinfo, rtype) File "/opt/bin/knowledge_graph/algo/graph/graph_operator.py", line 146, in clicknode idxs = self.search_module.get1hop(nodeinfo['id']) File "/opt/bin/knowledge_graph/algo/modules/search_module.py", line 91, in get1hop "match (n)-[r]-(m) return id(r)".format(idx)) File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/database.py", line 405, in run return self.auto().run(cypher, parameters, **kwparameters) File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/database.py", line 980, in run readonly=self.readonly) File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/client/__init__.py", line 1343, in auto_run cx.pull(result, n=pull) File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/client/bolt.py", line 527, in pull self._sync(response) File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/client/bolt.py", line 747, in _sync self._wait(response) File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/client/bolt.py", line 742, in _wait self._fetch() File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/client/bolt.py", line 717, in _fetch tag, fields = self.read_message() File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/client/bolt.py", line 644, in read_message tag, fields = self._reader.read_message() File "/opt/conda/envs/knowledge-graph/lib/python3.7/site-packages/py2neo/client/bolt.py", line 89, in read_message raise_from(ConnectionBroken("Failed to read message"), error) File "<string>", line 3, in raise_from py2neo.errors.ConnectionBroken: Failed to read message

    Although it does not affect the use but will often report errors, What can I do to prevent the code from reporting errors? Looking forward to your reply!

    opened by gqh1995 3
  • [Cluster.NotALeader] No write operations are allowed directly on this database. Writes must pass through the leader

    [Cluster.NotALeader] No write operations are allowed directly on this database. Writes must pass through the leader

    Hi,

    I am getting this exception when running a write query against a neo4j causal cluster version 4.3.6, this work fine with causal cluster of version 4.1.1. In both cases the query is sent to a follower server, py2neo is 2021.2.3.

    Graph is initialized using: Graph('neo4j://<dns_address>:7687', **settings)

    settings: {'user': 'neo4j', 'password': password, 'name': <db_name>, 'routing': True, 'routing_refresh_ttl': 300}

    Any idea what can cause this behavior?

    Thanks

    opened by kostia-sukernik 10
  • Recursive Querying feature

    Recursive Querying feature

    Idea

    I would like to suggest adding recursive querying to the possibilities of the match() method.

    Reasoning

    It very nice that one can query the database with the constructs of the package/objects. This means it is easy to create dynamic queries within the code without the need to create strings for it. It is possible to do it with a Cypher query as a string, but I think the package could benefit from a structural implementation.

    Additional information

    Based on this Stack Overflow question.

    I'm open to help with this.

    feature request 
    opened by erik470 0
Releases(2021.2.3)
Owner
py2neo.org
At the intersection of Python and Neo4j
py2neo.org
Neo4j Bolt driver for Python

Neo4j Bolt Driver for Python This repository contains the official Neo4j driver for Python. Each driver release (from 4.0 upwards) is built specifical

Neo4j 705 May 16, 2022
A Python Object-Document-Mapper for working with MongoDB

MongoEngine Info: MongoEngine is an ORM-like layer on top of PyMongo. Repository: https://github.com/MongoEngine/mongoengine Author: Harry Marr (http:

MongoEngine 3.8k May 18, 2022
A fast PostgreSQL Database Client Library for Python/asyncio.

asyncpg -- A fast PostgreSQL Database Client Library for Python/asyncio asyncpg is a database interface library designed specifically for PostgreSQL a

magicstack 5.5k May 26, 2022
Google Cloud Client Library for Python

Google Cloud Python Client Python idiomatic clients for Google Cloud Platform services. Stability levels The development status classifier on PyPI ind

Google APIs 3.9k May 17, 2022
python-bigquery Apache-2python-bigquery (🥈34 · ⭐ 3.5K · 📈) - Google BigQuery API client library. Apache-2

Python Client for Google BigQuery Querying massive datasets can be time consuming and expensive without the right hardware and infrastructure. Google

Google APIs 430 May 20, 2022
A Pythonic, object-oriented interface for working with MongoDB.

PyMODM MongoDB has paused the development of PyMODM. If there are any users who want to take over and maintain this project, or if you just have quest

mongodb 343 May 3, 2022
google-cloud-bigtable Apache-2google-cloud-bigtable (🥈31 · ⭐ 3.5K) - Google Cloud Bigtable API client library. Apache-2

Python Client for Google Cloud Bigtable Google Cloud Bigtable is Google's NoSQL Big Data database service. It's the same database that powers many cor

Google APIs 33 Apr 20, 2022
The Database Toolkit for Python

SQLAlchemy The Python SQL Toolkit and Object Relational Mapper Introduction SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that giv

SQLAlchemy 5.4k May 27, 2022
A Python-based RPC-like toolkit for interfacing with QuestDB.

pykit A Python-based RPC-like toolkit for interfacing with QuestDB. Requirements Python 3.9 Java Azul

QuestDB 8 Apr 10, 2022
Estoult - a Python toolkit for data mapping with an integrated query builder for SQL databases

Estoult Estoult is a Python toolkit for data mapping with an integrated query builder for SQL databases. It currently supports MySQL, PostgreSQL, and

halcyon[nouveau] 13 Feb 25, 2022
Toolkit for storing files and attachments in web applications

DEPOT - File Storage Made Easy DEPOT is a framework for easily storing and serving files in web applications on Python2.6+ and Python3.2+. DEPOT suppo

Alessandro Molina 138 May 18, 2022
Python version of the TerminusDB client - for TerminusDB API and WOQLpy

TerminusDB Client Python Development status ⚙️ Python Package status ?? Python version of the TerminusDB client - for TerminusDB API and WOQLpy Requir

TerminusDB 62 May 22, 2022
Pure Python MySQL Client

PyMySQL Table of Contents Requirements Installation Documentation Example Resources License This package contains a pure-Python MySQL client library,

PyMySQL 6.9k May 25, 2022
Python client for Apache Kafka

Kafka Python client Python client for the Apache Kafka distributed stream processing system. kafka-python is designed to function much like the offici

Dana Powers 4.8k May 24, 2022
Redis Python Client

redis-py The Python interface to the Redis key-value store. Python 2 Compatibility Note redis-py 3.5.x will be the last version of redis-py that suppo

Andy McCurdy 10.3k May 19, 2022
Redis client for Python asyncio (PEP 3156)

Redis client for Python asyncio. Redis client for the PEP 3156 Python event loop. This Redis library is a completely asynchronous, non-blocking client

Jonathan Slenders 543 May 16, 2022
Asynchronous Python client for InfluxDB

aioinflux Asynchronous Python client for InfluxDB. Built on top of aiohttp and asyncio. Aioinflux is an alternative to the official InfluxDB Python cl

Gustavo Bezerra 153 Apr 23, 2022
Official Python low-level client for Elasticsearch

Python Elasticsearch Client Official low-level client for Elasticsearch. Its goal is to provide common ground for all Elasticsearch-related code in Py

elastic 3.6k May 25, 2022
High level Python client for Elasticsearch

Elasticsearch DSL Elasticsearch DSL is a high-level library whose aim is to help with writing and running queries against Elasticsearch. It is built o

elastic 3.5k May 21, 2022