{ "info": { "author": "Javid Mougamadou", "author_email": "javidjms0@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Build Tools" ], "description": ".. figure:: ./artwork/logo.svg\n :alt:\n\nInfluxable\n==========\n\n|pypi version| |build status| |code coverage| |license: MIT|\n\nA lightweight python ORM / ODM / Client for InfluxDB\n\nTable of Contents\n-----------------\n\n- `Note <#note>`__\n- `Genesis <#genesis>`__\n- `Changelog <#changelog>`__\n- `Features <#features>`__\n- `Dependencies <#dependencies>`__\n- `Installation <#installation>`__\n- `Getting started <#getting-started>`__\n\n - `Connection <#connection>`__\n - `Measurement <#measurement>`__\n - `Simple Measurement <#simple-measurement>`__\n - `Instanciation <#instanciation>`__\n - `Query <#query>`__\n - `Saving Data <#saving-data>`__\n\n- `Auto Generation of Measurements <#auto-generation-of-measurements>`__\n- `Influxable commands <#influxable-commands>`__\n- `Influxable API <#influxable-api>`__\n\n - `Influxable Class <#influxable-class>`__\n - `InfluxDBApi Class <#influxdbapi-class>`__\n - `Connection Class <#connection-class>`__\n - `Measurement Class <#measurement-class>`__\n - `Attributes <#attributes>`__\n - `InfluxDBResponse <#influxdbresponse>`__\n - `Serializers <#serializers>`__\n - `Raw Query <#raw-query>`__\n - `Query Class <#query-class>`__\n - `Query aggregations function <#query-aggregations-function>`__\n - `Query selectors function <#query-selectors-function>`__\n - `Query transformations function <#query-transformations-function>`__\n - `InfluxDBAdmin <#influxdbadmin>`__\n - `Exceptions <#exceptions>`__\n\n- `Testing <#testing>`__\n- `Supporting <#supporting>`__\n- `Versioning <#versioning>`__\n- `Contributors <#contributors>`__\n- `Credits <#credits>`__\n- `References <#references>`__\n- `License <#license>`__\n\nNote\n----\n\nThis project is currently in development.\n\nA better documentation and testing scripts will be added in the next release.\n\nGenesis\n-------\n\nI worked on a project with InfluxDB. I needed to build an API for InfluxDB and to plug with Python libraries (scipy, pandas, etc ...).\n\nThat's why I decided to create this repository in order to deal with InfluxDB in a smooth way and to manipulate Python object.\n\nChangelog\n---------\n\n1.3.0\n~~~~~\n\n- Add *group\\_by()* method for *GROUP BY tags* instructions\n\n- Add *range()* method for *GROUP BY time()* instructions\n\n- Add *into()* method for *INTO* instructions\n\n- Add *tz()* method\n\n1.2.1\n~~~~~\n\n- Handle chinese characters.\n\nFeatures\n--------\n\n- Add automation for measurement class generation (command: *autogenerate*)\n\n- Admin commands allowing to manage the database (ex: *create\\_user()*, *show\\_series()*).\n\n- Measurement class allowing to make queries in order to fetch/save points (ex: *Measurement.where()*, *Measurement.bulk\\_save()*).\n\n- Group by commands\n\n- Different serializers for easy data manipulation (ex: *PandasSerializer*).\n\nDependencies\n------------\n\n- Python 3 (Tested with Python 3.7.3)\n\n- InfluxDB (Tested with InfluxDB 1.5.4)\n\nInstallation\n------------\n\nThe package is available in pypi. You can install it via pip :\n\n::\n\n pip install influxable\n\nGetting started\n---------------\n\nConnection\n~~~~~~~~~~\n\nYou can set your environment variable for the connection of InfluxDB in order to override the default values :\n\n::\n\n INFLUXDB_URL=http://localhost:8086\n INFLUXDB_DATABASE_NAME=default\n\n #Optional\n INFLUXDB_USER=admin\n INFLUXDB_PASSWORD=changme\n\nThen you just have to import the influxable package and create an instance of *Influxable* :\n\n.. code:: python\n\n from influxable import Influxable\n\n client = Influxable()\n\nYou can also set connection variable in *Influxable* constructor :\n\n.. code:: python\n\n # Without authentication\n\n client = Influxable(\n base_url='http://localhost:8086',\n database_name='default',\n )\n\n # With authentication\n\n client = Influxable(\n base_url='http://localhost:8086',\n database_name='default',\n user='admin',\n password='changeme',\n )\n\nMeasurement\n~~~~~~~~~~~\n\n.. code:: python\n\n from influxable import attributes, serializers\n from influxable.measurement import Measurement\n\n class TemperatureMeasurement(Measurement):\n parser_class = serializers.MeasurementPointSerializer # Default\n measurement_name = 'temperature'\n\n time = attributes.TimestampFieldAttribute()\n phase = attributes.TagFieldAttribute()\n value = attributes.FloatFieldAttribute()\n\nFields :\n\n- GenericFieldAttribute (IntegerFieldAttribute, FloatFieldAttribute, StringFieldAttribute, BooleanFieldAttribute)\n\n- TagFieldAttribute\n\n- TimestampFieldAttribute, DateTimeFieldAttribute\n\nParser Classes :\n\n- MeasurementPointSerializer (default)\n\n- JsonSerializer\n\n- FormattedSerieSerializer\n\n- FlatFormattedSerieSerializer\n\n- FlatSimpleResultSerializer\n\n- PandasSerializer\n\nSimple Measurement\n~~~~~~~~~~~~~~~~~~\n\n.. code:: python\n\n from influxable.measurement import SimpleMeasurement\n\n my_measurement = SimpleMeasurement('temperature', ['value'], ['phase'])\n\nInstanciation\n~~~~~~~~~~~~~\n\n.. code:: python\n\n point = TemperatureMeasurement(\n time=1568970572,\n phase=\"HOT\",\n value=23.5,\n )\n\nQuery\n~~~~~\n\nYou can query with *Measurement.get\\_query()* :\n\n.. code:: python\n\n from influxable.db import Field\n\n points = TemperatureMeasurement\\\n .get_query()\\\n .select('phase', 'value')\\\n .where(\n Field('value') > 15.2,\n Field('value') < 30.5,\n )\\\n .limit(100)\n .evaluate()\n\nYou can also query with *Query* :\n\n.. code:: python\n\n from influxable.db import Query, Field\n\n points = Query()\\\n .select('phase', 'value')\\\n .from_measurements('temperature')\\\n .where(\n Field('value') > 15.2,\n Field('value') < 30.5,\n )\\\n .limit(100)\n .execute()\n\nSaving Data\n~~~~~~~~~~~\n\nYou can create data by using *Measurement.bulk\\_save()*\n\n.. code:: python\n\n points = [\n TemperatureMeasurement(phase=\"HOT\",value=10,time=1463289075),\n TemperatureMeasurement(phase=\"COLD\",value=10,time=1463289076),\n ]\n TemperatureMeasurement.bulk_save(points)\n\nYou can also create data with *BulkInsertQuery*\n\n.. code:: python\n\n str_query = '''\n temperature,phase=HOT value=10 1463289075000000000\n temperature,phase=COLD value=10 1463289076000000000\n '''\n\n raw_query = BulkInsertQuery(str_query)\n res = raw_query.execute()\n\nAuto Generation of Measurements\n-------------------------------\n\nYou can automatically generate measurement classes file with the bash command *autogenerate*\n\n.. code:: bash\n\n influxable autogenerate #(default to auto_generate_measurement.py)\n influxable autogenerate -o measurement.py\n\nHere is the output generated file :\n\n.. code:: python\n\n # auto_generate_measurement.py\n\n from influxable import attributes\n from influxable.measurement import Measurement\n\n\n class CpuMeasurement(Measurement):\n measurement_name = 'cpu'\n\n time = attributes.TimestampFieldAttribute(precision='s')\n value = attributes.FloatFieldAttribute()\n host = attributes.TagFieldAttribute()\n\nInfluxable commands\n-------------------\n\n- *autogenerate* : automatic generation of measurement classes\n\n.. code:: bash\n\n influxable autogenerate #(default to auto_generate_measurement.py)\n influxable autogenerate -o measurement.py\n\n- *populate* : create a measurement filled with a set of random data\n\n.. code:: bash\n\n influxable populate\n influxable populate --min_value 5 --max_value 35 -s 2011-01-01T00:00:00 -id 1\n influxable populate --help\n\nInfluxable API\n--------------\n\nInfluxable Class\n~~~~~~~~~~~~~~~~\n\nThe Influxable main app class is a singleton. You can access it via the method *Influxable.get\\_instance()*\n\n\\_\\_init\\_\\_():\n^^^^^^^^^^^^^^^\n\n- base\\_url : url to connect to the InfluxDB server (default = 'http://localhost:8086')\n\n- user : authentication user name (default = 'admin')\n\n- password : authentication user password (default = 'changeme')\n\n- database\\_name : name of the database (default = 'default')\n\ncreate\\_connection() -> Connection:\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- base\\_url : url to connect to the InfluxDB server (default = 'http://localhost:8086')\n\n- user : authentication user name (default = 'admin')\n\n- password : authentication user password (default = 'changeme')\n\n- database\\_name : name of the database (default = 'default')\n\nping() -> bool:\n^^^^^^^^^^^^^^^\n\n- verbose : enables verbose mode (default = True)\n\nexecute\\_query() -> json():\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- query: influxdb query to execute\n- method: http method of the request (default='get')\n- chunked: if enabled, responses will be chunked by series or by every 10,000 points (default=False)\n- epoch: specified precision of the timestamp [ns,u,\u00b5,ms,s,m,h] (default='ns')\n- pretty: if enadble, the json response is pretty-printed (default=False)\n\nwrite\\_points() -> bool:\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n- points: data to write in InfluxDB line protocol format\n\nex: mymeas,mytag1=1 value=21 1463689680000000000\n\n- precision: specified precision of the timestamp [ns,u,\u00b5,ms,s,m,h] (default='ns')\n- consistency: sets the write consistency for the point [any,one,quorum,all] (default='all')\n- retention\\_policy\\_name: sets the target retention policy for the write (default='DEFAULT')\n\nInfluxDBApi Class\n~~~~~~~~~~~~~~~~~\n\nget\\_debug\\_requests() -> bool:\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- request : instance of InfluxDBRequest\n\nget\\_debug\\_vars() -> bool:\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- request : instance of InfluxDBRequest\n\nping() -> bool:\n^^^^^^^^^^^^^^^\n\n- request : instance of InfluxDBRequest\n\n- verbose : enables verbose mode (default = True)\n\nexecute\\_query() -> json():\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- request : instance of InfluxDBRequest\n- query: influxdb query to execute\n- method: http method of the request (default='get')\n- chunked: if enabled, responses will be chunked by series or by every 10,000 points (default=False)\n- epoch: specified precision of the timestamp [ns,u,\u00b5,ms,s,m,h] (default='ns')\n- pretty: if enadble, the json response is pretty-printed (default=False)\n\nwrite\\_points() -> bool:\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n- request : instance of InfluxDBRequest\n\n- points: data to write in InfluxDB line protocol format\n\nex: mymeas,mytag1=1 value=21 1463689680000000000\n\n- precision: specified precision of the timestamp [ns,u,\u00b5,ms,s,m,h] (default='ns')\n- consistency: sets the write consistency for the point [any,one,quorum,all] (default='all')\n- retention\\_policy\\_name: sets the target retention policy for the write (default='DEFAULT')\n\nConnection Class\n~~~~~~~~~~~~~~~~\n\n\\_\\_init\\_\\_():\n^^^^^^^^^^^^^^^\n\n- base\\_url : url to connect to the InfluxDB server (default = 'http://localhost:8086')\n\n- user : authentication user name (default = 'admin')\n\n- password : authentication user password (default = 'changeme')\n\n- database\\_name : name of the database (default = 'default')\n\ncreate() -> Connection:\n^^^^^^^^^^^^^^^^^^^^^^^\n\n- base\\_url : url to connect to the InfluxDB server (default = 'http://localhost:8086')\n\n- user : authentication user name (default = 'admin')\n\n- password : authentication user password (default = 'changeme')\n\n- database\\_name : name of the database (default = 'default')\n\nMeasurement Class\n~~~~~~~~~~~~~~~~~\n\nfields\n^^^^^^\n\nMust be an instance of class located in *influxable.attributes*\n\n- GenericFieldAttribute\n\n- IntegerFieldAttribute\n\n- FloatFieldAttribute\n\n- StringFieldAttribute\n\n- BooleanFieldAttribute\n\n- TagFieldAttribute\n\n- TimestampFieldAttribute\n\n- DateTimeFieldAttribute\n\nExample :\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n\n time = TimestampFieldAttribute(auto_now=True, precision='s')\n phase = TagFieldAttribute()\n value = IntegerFieldAttribute()\n\nparser\\_class\n^^^^^^^^^^^^^\n\nMust be a class of *influxable.serializers* :\n\n- MeasurementPointSerializer (default)\n\n- JsonSerializer\n\n- FormattedSerieSerializer\n\n- FlatFormattedSerieSerializer\n\n- FlatSimpleResultSerializer\n\n- PandasSerializer\n\nmeasurement\\_name\n^^^^^^^^^^^^^^^^^\n\nName of the measurement in InfluxDB\n\n\\_\\_init\\_\\_():\n^^^^^^^^^^^^^^^\n\nSet the attribute value of a Measurement\n\nExample\n\n.. code:: python\n\n point = MySensorMeasurement(value=0.5, phase=\"MOON\")\n\nget\\_query() -> Query:\n^^^^^^^^^^^^^^^^^^^^^^\n\nReturn an instance of Query which\n\nExample\n\n.. code:: python\n\n points = MySensorMeasurement\\\n .get_query()\\\n .select()\\\n .where()\\\n .limit()\\\n .evaluate()\n\ndict()\n^^^^^^\n\nReturn a dict of the point values\n\nExample\n\n.. code:: python\n\n point = MySensorMeasurement(value=0.5, phase=\"MOON\")\n\n point.dict()\n\n # {'time': Decimal('1568970572'), 'phase': 'MOON', 'value': 0.5}\n\nitems()\n^^^^^^^\n\nReturn an item list of the point values\n\nExample\n\n.. code:: python\n\n point = MySensorMeasurement(value=0.5, phase=\"MOON\")\n\n point.items()\n\n # dict_items([('time', Decimal('1568970572')), ('phase', 'MOON'), ('value', 0.5)])\n\nbulk\\_save()\n^^^^^^^^^^^^\n\nSave a list of measurement point\n\n.. code:: python\n\n points = [\n MySensorMeasurement(phase=\"moon\",value=5,time=1463489075),\n MySensorMeasurement(phase=\"moon\",value=7,time=1463489076),\n MySensorMeasurement(phase=\"sun\",value=8,time=1463489077),\n ]\n MySensorMeasurement.bulk_save(points)\n\nAttributes\n~~~~~~~~~~\n\nGenericFieldAttribute\n^^^^^^^^^^^^^^^^^^^^^\n\n- attribute\\_name : real name of the measurement attribute in database\n\n- default : set a default value if it is not filled at the instanciation\n\n- is\\_nullable : if False, it will raise an error if the value is null (default=True)\n\n- enforce\\_cast : if False, it will not raise an error when the value has not the desired type without casting (default=True).\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n\n temperature_value = GenericFieldAttribute(\n attribute_name=\"temp_v1\",\n default=\"15\",\n is_nullable=True,\n enforce_cast=False,\n )\n\nIntegerFieldAttribute\n^^^^^^^^^^^^^^^^^^^^^\n\n- min\\_value : an error is raised if the value is less than the min\\_value\n\n- max\\_value : an error is raised if the value is greater than the max\\_value\n\n- attribute\\_name : real name of the measurement attribute in database\n\n- default : set a default value if it is not filled at the instanciation\n\n- is\\_nullable : if False, it will raise an error if the value is null (default=True)\n\n- enforce\\_cast : if False, it will not raise an error when the value has not the desired type without casting (default=True).\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n\n temperature_value = IntegerFieldAttribute(\n min_value=10,\n max_value=30,\n )\n\nFloatFieldAttribute\n^^^^^^^^^^^^^^^^^^^\n\n- max\\_nb\\_decimals : set the maximal number of decimals to display\n\n- min\\_value : an error is raised if the value is less than the min\\_value\n\n- max\\_value : an error is raised if the value is greater than the max\\_value\n\n- attribute\\_name : real name of the measurement attribute in database\n\n- default : set a default value if it is not filled at the instanciation\n\n- is\\_nullable : if False, it will raise an error if the value is null (default=True)\n\n- enforce\\_cast : if False, it will not raise an error when the value has not the desired type without casting (default=True).\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n\n value = FloatFieldAttribute(\n max_nb_decimals=5,\n )\n\nStringFieldAttribute\n^^^^^^^^^^^^^^^^^^^^\n\n- choices : an error is raised if the value is not in the list of string options\n\n- max\\_length : an error is raised if the string value length is greater than the max\\_length\n\n- attribute\\_name : real name of the measurement attribute in database\n\n- default : set a default value if it is not filled at the instanciation\n\n- is\\_nullable : if False, it will raise an error if the value is null (default=True)\n\n- enforce\\_cast : if False, it will not raise an error when the value has not the desired type without casting (default=True).\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n\n position = FloatFieldAttribute(\n choices=['first', 'last'],\n max_length=7,\n )\n\nBooleanFieldAttribute\n^^^^^^^^^^^^^^^^^^^^^\n\n- attribute\\_name : real name of the measurement attribute in database\n\n- default : set a default value if it is not filled at the instanciation\n\n- is\\_nullable : if False, it will raise an error if the value is null (default=True)\n\n- enforce\\_cast : if False, it will not raise an error when the value has not the desired type without casting (default=True).\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n\n is_marked = BooleanFieldAttribute(\n default=False,\n )\n\nTagFieldAttribute\n^^^^^^^^^^^^^^^^^\n\n- attribute\\_name : real name of the measurement attribute in database\n\n- default : set a default value if it is not filled at the instanciation\n\n- is\\_nullable : if False, it will raise an error if the value is null (default=True)\n\n- enforce\\_cast : if False, it will not raise an error when the value has not the desired type without casting (default=True).\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n\n phase = TagFieldAttribute(\n default='MOON',\n )\n\nTimestampFieldAttribute\n^^^^^^^^^^^^^^^^^^^^^^^\n\n- auto\\_now : Set automatically the current date (default=False)\n\n- precision : Set the timestamp precision which must be one of [ns,u,ms,s,m,h] (default= 'ns')\n\n- attribute\\_name : real name of the measurement attribute in database\n\n- default : set a default value if it is not filled at the instanciation\n\n- is\\_nullable : if False, it will raise an error if the value is null (default=True)\n\n- enforce\\_cast : if False, it will not raise an error when the value has not the desired type without casting (default=True).\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n\n time = TimestampFieldAttribute(\n auto_now=True,\n precision='s',\n )\n\nDateTimeFieldAttribute\n^^^^^^^^^^^^^^^^^^^^^^\n\n- str\\_format : Set the arrow format of the timestamp to display (default: \"YYYY-MM-DD HH:mm:ss\")\n\n- auto\\_now : Set automatically the current date\n\n- precision : Set the timestamp precision which must be one of [ns,u,ms,s,m,h]\n\n- attribute\\_name : real name of the measurement attribute in database\n\n- default : set a default value if it is not filled at the instanciation\n\n- is\\_nullable : if False, it will raise an error if the value is null (default=True)\n\n- enforce\\_cast : if False, it will not raise an error when the value has not the desired type without casting (default=True).\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n\n date = DateTimeFieldAttribute(\n attribute_name='time',\n auto_now=True,\n str_format='YYYY-MM-DD',\n )\n\nInfluxDBResponse\n~~~~~~~~~~~~~~~~\n\n\\_\\_init\\_\\_():\n^^^^^^^^^^^^^^^\n\n- raw\\_json : the raw json response object\n\nraw\n^^^\n\nReturn the raw\\_json value\n\nmain\\_serie\n^^^^^^^^^^^\n\nReturn the first serie from the *series* field in the raw\\_json value\n\nseries\n^^^^^^\n\nReturn the *series* field in the raw\\_json value\n\nerror\n^^^^^\n\nReturn the *error* field in the raw\\_json value\n\nExample of json raw response :\n\n.. code:: python\n\n {\n \"results\":[\n {\n \"statement_id\":0,\n \"series\":[\n {\n \"name\":\"mymeas\",\n \"columns\":[\n \"time\",\n \"myfield\",\n \"mytag1\",\n \"mytag2\"\n ],\n \"values\":[\n [\n \"2017-03-01T00:16:18Z\",\n 33.1,\n null,\n null\n ],\n [\n \"2017-03-01T00:17:18Z\",\n 12.4,\n \"12\",\n \"14\"\n ]\n ]\n }\n ]\n }\n ]\n }\n\nSerializers\n~~~~~~~~~~~\n\nSerializers can be used in *parser\\_class* field of *Measurement* class.\n\n.. code:: python\n\n class MySensorMeasurement(Measurement):\n measurement_name = 'mysensor'\n parser_class = serializers.BaseSerializer\n\nIt allow to change the output response format of a influxb request\n\n.. code:: python\n\n # res is formatted with BaseSerializer\n res = MySensorMeasurement.get_query().limit(10).evaluate()\n\nBaseSerializer\n^^^^^^^^^^^^^^\n\n.. code:: python\n\n # res is formatted with BaseSerializer\n res\n {'results': [{'statement_id': 0, 'series': [{'name': 'mysamplemeasurement', 'columns': ['time', 'value'], 'values': [[1570481055000000000, 10], [1570481065000000000, 20], [1570481075000000000, 30]]}]}]}\n\nJsonSerializer\n^^^^^^^^^^^^^^\n\n.. code:: python\n\n # res is formatted with JsonSerializer\n res\n '{\"results\": [{\"statement_id\": 0, \"series\": [{\"name\": \"mysamplemeasurement\", \"columns\": [\"time\", \"value\"], \"values\": [[1570481055000000000, 10], [1570481065000000000, 20], [1570481075000000000, 30]]}]}]}'\n\nFormattedSerieSerializer\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n # res is formatted with FormattedSerieSerializer\n res\n [{'mysamplemeasurement': [{'time': 1570481055000000000, 'value': 10}, {'time': 1570481065000000000, 'value': 20}, {'time': 1570481075000000000, 'value': 30}]}]\n\nFlatFormattedSerieSerializer\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n # res is formatted with FlatFormattedSerieSerializer\n [{'time': 1570481055000000000, 'value': 10}, {'time': 1570481065000000000, 'value': 20}, {'time': 1570481075000000000, 'value': 30}]\n\nFlatSimpleResultSerializer\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis serializer is used only when the result set contains only one column\n\n.. code:: python\n\n res = InfluxDBAdmin.show_databases()\n\n # res is formatted with FlatSimpleResultSerializer\n res\n ['_internal', 'example', 'test', 'telegraf', 'mydb', ...]\n\nFlatSingleValueSerializer\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis serializer is used only when the result set contains only one value\n\n.. code:: python\n\n res = InfluxDBAdmin.show_measurement_cardinality()\n\n # res is formatted with FlatSingleValueSerializer\n res\n 2\n\nPandasSerializer\n^^^^^^^^^^^^^^^^\n\n.. code:: python\n\n # res is formatted with PandasSerializer\n res time value\n 0 1570481055000000000 10\n 1 1570481065000000000 20\n 2 1570481075000000000 30\n\nMeasurementPointSerializer\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis is the default serializer class for Measurement\n\n.. code:: python\n\n [, , ]\n\nRaw Query\n~~~~~~~~~\n\n- str\\_query\n\nExample :\n\n.. code:: python\n\n from influxable.db import RawQuery\n str_query = 'SHOW DATABASES'\n res = RawQuery(str_query).execute()\n\n.. code:: python\n\n from influxable.db import RawQuery\n str_query = 'SELECT * FROM temperature LIMIT 10'\n res = RawQuery(str_query).execute()\n\nQuery Class\n~~~~~~~~~~~\n\nYou can generate an instance of Query via the initial Query constructor or from a measurement.\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query\n query = Query()\n ...\n\n.. code:: python\n\n query = MySensorMeasurement.get_query()\n ...\n\nMethods :\n\nfrom\\_measurements()\n^^^^^^^^^^^^^^^^^^^^\n\n- \\*measurements\n\nExample :\n\n.. code:: python\n\n query = Query()\\\n .from_measurements('measurement1', 'measurement2')\n\nRender :\n\n.. code:: sql\n\n FROM measurement1, measurement2\n\nselect()\n^^^^^^^^\n\n- \\*fields\n\nExample :\n\n.. code:: python\n\n query = Query()\\\n .select('param1', 'param2')\\\n .from_measurements('measurement1')\n\nRender :\n\n.. code:: sql\n\n SELECT value, phase\n\nwhere()\n^^^^^^^\n\n- \\*criteria\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .select('param1', 'param2')\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\n\nRender :\n\n.. code:: sql\n\n WHERE param1 > 800 AND param1 < 900\n\nlimit()\n^^^^^^^\n\n- value\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .select('param1', 'param2')\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .limit(10)\n\nRender :\n\n.. code:: sql\n\n LIMIT 10\n\nslimit()\n^^^^^^^^\n\n- value\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .select('param1', 'param2')\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .limit(10)\\\n .slimit(5)\n\nRender :\n\n.. code:: sql\n\n SLIMIT 5\n\noffset()\n^^^^^^^^\n\n- value\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .select('param1', 'param2')\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .offset(10)\n\nRender :\n\n.. code:: sql\n\n OFFSET 10\n\nsoffset()\n^^^^^^^^^\n\n- value\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .select('param1', 'param2')\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .offset(10)\\\n .soffset(5)\n\nRender :\n\n.. code:: sql\n\n SOFFSET 5\n\ninto()\n^^^^^^\n\n- \\*measurement\n\nExample :\n\n.. code:: python\n\n query = Query()\\\n .select('param1')\\\n .from_measurements('measurement1')\\\n .into('measurement2')\n\nRender :\n\n.. code:: sql\n\n SELECT param1 INTO measurement2 FROM measurement1\n\nasc()\n^^^^^\n\nExample :\n\n.. code:: python\n\n query = Query()\\\n .select('param1')\\\n .from_measurements('measurement1')\\\n .asc()\n\nRender :\n\n.. code:: sql\n\n SELECT param1 FROM measurement1 ORDER BY ASC\n\ndesc()\n^^^^^^\n\nExample :\n\n.. code:: python\n\n query = Query()\\\n .select('param1')\\\n .from_measurements('measurement1')\\\n .desc()\n\nRender :\n\n.. code:: sql\n\n SELECT param1 FROM measurement1 ORDER BY DESC\n\ntz()\n^^^^\n\nExample :\n\n.. code:: python\n\n query = Query()\\\n .select('param1')\\\n .from_measurements('measurement1')\\\n .tz('Europe/Paris')\n\nRender :\n\n.. code:: sql\n\n SELECT param1 FROM measurement1 tz('Europe/Paris')\n\ngroup\\_by()\n^^^^^^^^^^^\n\n- \\*tags\n\nExample :\n\n.. code:: python\n\n query = Query()\\\n .select('param1')\\\n .from_measurements('measurement1')\\\n .group_by('tag_1')\n\nRender :\n\n.. code:: sql\n\n SELECT param1 FROM measurement1 GROUP BY tag_1\n\nrange\\_by()\n^^^^^^^^^^^\n\n- \\*interval\n- \\*shift\n- \\*fill\n- \\*tags\n\nExample :\n\n.. code:: python\n\n query = Query()\\\n .select('param1')\\\n .from_measurements('measurement1')\\\n .range_by('12s', shift='1d', tags=['tag1'], fill=3)\n\nRender :\n\n.. code:: sql\n\n SELECT param1 FROM measurement1 GROUP BY time(12s,1d),tag1 fill(3)'\n\nexecute()\n^^^^^^^^^\n\nExecute the query and return the response\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n res = Query()\\\n .select('param1', 'param2')\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .execute()\n res\n\nResult :\n\n.. code:: python\n\n {'results': [{'statement_id': 0, 'series': [{'name': 'measurement1', 'columns': ['time', 'value'], 'values': [[1570481055000000000, 10], [1570481065000000000, 20], [1570481075000000000, 30]]}]}]}\n\nevaluate()\n^^^^^^^^^^\n\nExecute the query and return the serialized response\n\n- parser\\_class (default=BaseSerializer for Query and MeasurementPointSerializer for Measurement)\n\nExample with Query :\n\n.. code:: python\n\n from influxable.db import Query, Field\n res = Query()\\\n .select('param1', 'param2')\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .evaluate()\n res\n\nResult :\n\n.. code:: python\n\n {'results': [{'statement_id': 0, 'series': [{'name': 'measurement1', 'columns': ['time', 'value'], 'values': [[1570481055000000000, 10], [1570481065000000000, 20], [1570481075000000000, 30]]}]}]}\n\nExample with Measurement :\n\n.. code:: python\n\n from influxable.db import Field\n points = MySensorMeasurement.get_query()\n .select('param1', 'param2')\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .evaluate()\n points\n\nResult :\n\n.. code:: python\n\n [, , ]\n\ncount()\n^^^^^^^\n\n- value (default='\\*')\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .count()\n\nRender :\n\n.. code:: sql\n\n SELECT COUNT(*)\n\ndistinct()\n^^^^^^^^^^\n\n- value (default='\\*')\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .distinct()\n\nRender :\n\n.. code:: sql\n\n SELECT DISTINCT(*)\n\nintegral()\n^^^^^^^^^^\n\n- value (default='\\*')\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .integral()\n\nRender :\n\n.. code:: sql\n\n SELECT INTEGRAL(*)\n\nmean()\n^^^^^^\n\n- value (default='\\*')\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .mean()\n\nRender :\n\n.. code:: sql\n\n SELECT MEAN(*)\n\nmedian()\n^^^^^^^^\n\n- value (default='\\*')\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .median()\n\nRender :\n\n.. code:: sql\n\n SELECT MEDIAN(*)\n\nmode()\n^^^^^^\n\n- value (default='\\*')\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .mode()\n\nRender :\n\n.. code:: sql\n\n SELECT MODE(*)\n\nspread()\n^^^^^^^^\n\n- value (default='\\*')\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .spread()\n\nRender :\n\n.. code:: sql\n\n SELECT SPREAD(*)\n\nstd\\_dev()\n^^^^^^^^^^\n\n- value (default='\\*')\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .std_dev()\n\nRender :\n\n.. code:: sql\n\n SELECT STDDEV(*)\n\nsum()\n^^^^^\n\n- value (default='\\*')\n\nExample :\n\n.. code:: python\n\n from influxable.db import Query, Field\n query = Query()\\\n .from_measurements('measurement1')\\\n .where(\n Field('param1') > 800,\n Field('param1') < 900,\n )\\\n .sum()\n\nRender :\n\n.. code:: sql\n\n SELECT SUM(*)\n\nQuery aggregations function\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUsage :\n\n.. code:: python\n\n from influxable.db.function import aggregations\n res = Query()\\\n .select(aggregations.Sum('value'))\\\n .from_measurements('param1')\\\n .execute()\n\nCount\n^^^^^\n\nDistinct\n^^^^^^^^\n\nIntegral\n^^^^^^^^\n\nMean\n^^^^\n\nMedian\n^^^^^^\n\nMode\n^^^^\n\nSpread\n^^^^^^\n\nStdDev\n^^^^^^\n\nSum\n^^^\n\nQuery selectors function\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nUsage :\n\n.. code:: python\n\n from influxable.db.function import selectors\n res = Query()\\\n .select(selectors.Min('value'), selectors.Max('value'))\\\n .from_measurements('param1')\\\n .execute()\n\nBottom\n^^^^^^\n\nFirst\n^^^^^\n\nLast\n^^^^\n\nMax\n^^^\n\nMin\n^^^\n\nPercentile\n^^^^^^^^^^\n\nSample\n^^^^^^\n\nTop\n^^^\n\nQuery transformations function\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUsage :\n\n.. code:: python\n\n from influxable.db.function import selectors, transformations\n res = Query()\\\n .select(transformations.Abs('value'))\\\n .from_measurements('param1')\\\n .execute()\n\n.. code:: python\n\n from influxable.db.function.selectors import Min, Max\n from influxable.db.function.transformations import Abs\n res = Query()\\\n .select(Abs(Min('value')), Abs(Max('value')))\\\n .from_measurements('param1')\\\n .execute()\n\nAbs\n^^^\n\nACos\n^^^^\n\nASin\n^^^^\n\nATan\n^^^^\n\nATan2\n^^^^^\n\nCeil\n^^^^\n\nCos\n^^^\n\nCumulativeSum\n^^^^^^^^^^^^^\n\nDerivative\n^^^^^^^^^^\n\nDifference\n^^^^^^^^^^\n\nElapsed\n^^^^^^^\n\nExp\n^^^\n\nFloor\n^^^^^\n\nHistogram\n^^^^^^^^^\n\nLn\n^^\n\nLog\n^^^\n\nLog2\n^^^^\n\nLog10\n^^^^^\n\nMovingAverage\n^^^^^^^^^^^^^\n\nNonNegativeDerivative\n^^^^^^^^^^^^^^^^^^^^^\n\nNonNegativeDifference\n^^^^^^^^^^^^^^^^^^^^^\n\nPow\n^^^\n\nRound\n^^^^^\n\nSin\n^^^\n\nSqrt\n^^^^\n\nTan\n^^^\n\nInfluxDBAdmin\n~~~~~~~~~~~~~\n\nalter\\_retention\\_policy()\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- policy\\_name\n\n- duration (default=None)\n\n- replication (default=None)\n\n- shard\\_duration (default=None)\n\n- is\\_default (default=False)\n\n.. code:: sql\n\n ALTER RETENTION POLICY {policy_name} ON {database_name} [DURATION {duration} REPLICATION {replication} SHARD DURATION {shard_duration} DEFAULT]\n\ncreate\\_database()\n^^^^^^^^^^^^^^^^^^\n\n- new\\_database\\_name\n\n- duration (default=None)\n\n- replication (default=None)\n\n- shard\\_duration (default=None)\n\n- policy\\_name (default=False)\n\n.. code:: sql\n\n CREATE DATABASE {new_database_name} [WITH DURATION {duration} REPLICATION {replication} SHARD DURATION {shard_duration} NAME {policy_name}]\n\ncreate\\_retention\\_policy()\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- policy\\_name\n\n- duration (default=None)\n\n- replication (default=None)\n\n- shard\\_duration (default=None)\n\n- is\\_default (default=False)\n\n.. code:: sql\n\n CREATE RETENTION POLICY {policy_name} ON {database_name} [DURATION {duration} REPLICATION {replication} SHARD DURATION {shard_duration} DEFAULT]\n\ncreate\\_subscription()\n^^^^^^^^^^^^^^^^^^^^^^\n\n- subscription\\_name\n\n- hosts\n\n- any (default=False)\n\n.. code:: sql\n\n CREATE SUBSCRIPTION {subscription_name} ON {database_name} DESTINATIONS ANY/ALL {hosts}\n\ncreate\\_user()\n^^^^^^^^^^^^^^\n\n- user\\_name\n\n- password\n\n- with\\_privileges (default=False)\n\n.. code:: sql\n\n CREATE USER {user_name} WITH PASSWORD {password} [WITH ALL PRIVILEGES]\n\ndelete()\n^^^^^^^^\n\n- measurements (default=[])\n\n- criteria (default=[])\n\n.. code:: sql\n\n DELETE FROM {measurements} WHERE {criteria}\n\ndrop\\_continuous\\_query()\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- query\\_name\n\n.. code:: sql\n\n DROP CONTINUOUS QUERY {query_name} ON {database_name}\n\ndrop\\_database()\n^^^^^^^^^^^^^^^^\n\n- database\\_name\\_to\\_delete\n\n.. code:: sql\n\n DROP DATABASE {database_name_to_delete}\n\ndrop\\_measurement()\n^^^^^^^^^^^^^^^^^^^\n\n- measurement\\_name\n\n.. code:: sql\n\n DROP MEASUREMENT {measurement_name}\n\ndrop\\_retention\\_policy()\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- policy\\_name\n\n.. code:: sql\n\n DROP RETENTION POLICY {policy_name} ON {database_name}\n\ndrop\\_series()\n^^^^^^^^^^^^^^\n\n- measurements (default=[])\n\n- criteria (default=[])\n\n.. code:: sql\n\n DROP SERIES FROM {measurements} WHERE {criteria}\n\ndrop\\_subscription()\n^^^^^^^^^^^^^^^^^^^^\n\n- subscription\\_name\n\n.. code:: sql\n\n DROP SUBSCRIPTION {subscription_name} ON {full_database_name}\n\ndrop\\_user()\n^^^^^^^^^^^^\n\n- user\\_name\n\n.. code:: sql\n\n DROP USER {user_name}\n\nexplain()\n^^^^^^^^^\n\n- query\n\n- analyze (default=False)\n\n.. code:: sql\n\n EXPLAIN [ANALYZE] {query}\n\ngrant()\n^^^^^^^\n\n- privilege\n\n- user\\_name\n\n.. code:: sql\n\n GRANT {privilege} ON {database_name} TO {user_name}\n\nkill()\n^^^^^^\n\n- query\\_id\n\n.. code:: sql\n\n KILL QUERY {query_id}\n\nrevoke()\n^^^^^^^^\n\n- privilege\n\n- user\\_name\n\n.. code:: sql\n\n REVOKE {privilege} ON {database_name} FROM {user_name}\n\nshow\\_field\\_key\\_cardinality()\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- exact (default=False)\n\n.. code:: sql\n\n SHOW FIELD KEY [EXACT] CARDINALITY\n\nshow\\_measurement\\_cardinality()\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- exact (default=False)\n\n.. code:: sql\n\n SHOW MEASUREMENT [EXACT] CARDINALITY\n\nshow\\_series\\_cardinality()\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- exact (default=False)\n\n.. code:: sql\n\n SHOW SERIES [EXACT] CARDINALITY\n\nshow\\_tag\\_key\\_cardinality()\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- key\n\n- exact (default=False)\n\n.. code:: sql\n\n SHOW TAG VALUES [EXACT] CARDINALITY WITH KEY = {key}\n\nshow\\_continuous\\_queries()\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW CONTINUOUS QUERIES\n\nshow\\_diagnostics()\n^^^^^^^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW DIAGNOSTICS\n\nshow\\_field\\_keys()\n^^^^^^^^^^^^^^^^^^^\n\n- measurements (default=[])\n\n.. code:: sql\n\n SHOW FIELD KEYS FROM {measurements}\n\nshow\\_grants()\n^^^^^^^^^^^^^^\n\n- user\\_name\n\n.. code:: sql\n\n SHOW GRANTS FOR {user_name}\n\nshow\\_databases()\n^^^^^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW DATABASES\n\nshow\\_measurements()\n^^^^^^^^^^^^^^^^^^^^\n\n- criteria (default=[])\n\n.. code:: sql\n\n SHOW MEASUREMENTS WHERE {criteria}\n\nshow\\_queries()\n^^^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW QUERIES\n\nshow\\_retention\\_policies()\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW RETENTION POLICIES\n\nshow\\_series()\n^^^^^^^^^^^^^^\n\n- measurements (default=[])\n\n- criteria (default=[])\n\n- limit (default=None)\n\n- offset (default=None)\n\n.. code:: sql\n\n SHOW SERIES ON {database_name} [FROM {measurements} WHERE {criteria} LIMIT {limit} OFFSET {offset}]\n\nshow\\_stats()\n^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW STATS\n\nshow\\_shards()\n^^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW SHARDS\n\nshow\\_shard\\_groups()\n^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW SHARD GROUPS\n\nshow\\_subscriptions()\n^^^^^^^^^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW SUBSCRIPTIONS\n\nshow\\_tag\\_keys()\n^^^^^^^^^^^^^^^^^\n\n- measurements (default=[])\n\n.. code:: sql\n\n SHOW TAG KEYS [FROM {measurements}]\n\nshow\\_tag\\_values()\n^^^^^^^^^^^^^^^^^^^\n\n- key\n\n- measurements (default=[])\n\n.. code:: sql\n\n SHOW TAG VALUES [FROM {measurements}] WITH KEY = {key}\n\nshow\\_users()\n^^^^^^^^^^^^^\n\n.. code:: sql\n\n SHOW USERS\n\nExceptions\n~~~~~~~~~~\n\nInfluxDBException\n^^^^^^^^^^^^^^^^^\n\nInfluxDBError\n^^^^^^^^^^^^^\n\nInfluxDBConnectionError\n^^^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBInvalidResponseError\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBInvalidChoiceError\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBInvalidTypeError\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBInvalidURLError\n^^^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBBadRequestError\n^^^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBBadQueryError\n^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBInvalidNumberError\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBInvalidTimestampError\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBUnauthorizedError\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nInfluxDBAttributeValueError\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nTesting\n-------\n\nFirst, you need to install pytest via the file *requirements-test.txt*\n\n.. code:: bash\n\n pip install -r requirements-test.txt\n\nThen, you can launch the *pytest* command.\n\n.. code:: python\n\n pytest -v\n\nSupporting\n----------\n\nFeel free to post issues your feedback or if you reach a problem with influxable library.\n\nIf you want to contribute, please use the pull requests section.\n\nVersioning\n----------\n\nWe use `SemVer `__ for versioning. For the versions available, see the `tags on this repository `__\n\nContributors\n------------\n\n- `Javid Mougamadou `__\n\nCredits\n-------\n\n- Logo designed by `Maxime Bergerard `__\n\nReferences\n----------\n\n- `Influxdb Website `__\n\n- `Influxdb Github Repository `__\n\n- `Influxdb-Python Github Repository `__\n\nLicense\n-------\n\n`MIT `__\n\n.. |pypi version| image:: https://img.shields.io/badge/pypi-1.3.1-blue\n :target: https://pypi.org/project/influxable/\n.. |build status| image:: https://img.shields.io/badge/build-passing-green\n.. |code coverage| image:: https://img.shields.io/badge/coverage-100-green\n.. |license: MIT| image:: https://img.shields.io/badge/License-MIT-blue.svg", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/Javidjms/influxable/archive/1.3.1.zip", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Javidjms/influxable", "keywords": "python,influxdb,odm,orm,driver,client", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "influxable", "package_url": "https://pypi.org/project/influxable/", "platform": "", "project_url": "https://pypi.org/project/influxable/", "project_urls": { "Download": "https://github.com/Javidjms/influxable/archive/1.3.1.zip", "Homepage": "https://github.com/Javidjms/influxable", "Source": "https://github.com/Javidjms/influxable" }, "release_url": "https://pypi.org/project/influxable/1.3.1/", "requires_dist": null, "requires_python": ">=3.0.*", "summary": "A lightweight python ORM / ODM for InfluxDB", "version": "1.3.1", "yanked": false, "yanked_reason": null }, "last_serial": 9233272, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "84b32aeaec6a471ebb9bfaf5ec5b46fd", "sha256": "3a9182dd7c6ebd2029ce0dc768c2c83fc1b3446f3a6d5cf4dad04bb7a0df9f05" }, "downloads": -1, "filename": "influxable-0.0.0.tar.gz", "has_sig": false, "md5_digest": "84b32aeaec6a471ebb9bfaf5ec5b46fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2104, "upload_time": "2019-08-30T22:18:41", "upload_time_iso_8601": "2019-08-30T22:18:41.152135Z", "url": "https://files.pythonhosted.org/packages/2d/69/71c6f864bfb536225e1c37cb50d2e9a134bb61bed92895578edb89595c83/influxable-0.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.1-alpha.0": [ { "comment_text": "", "digests": { "md5": "0a6d419e3e8b8ad31ccd40582e035803", "sha256": "83fd19b7229a43ae1377d37ec480e263af44fcc3379abaf8f131ad2dc62c7ccc" }, "downloads": -1, "filename": "influxable-0.0.1-alpha.0.tar.gz", "has_sig": false, "md5_digest": "0a6d419e3e8b8ad31ccd40582e035803", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2121, "upload_time": "2019-08-30T22:37:55", "upload_time_iso_8601": "2019-08-30T22:37:55.591325Z", "url": "https://files.pythonhosted.org/packages/2d/91/8721d2c551cb007b0938c766baba19c1b03fa5766fc8411f28b51ad35539/influxable-0.0.1-alpha.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.1a1": [ { "comment_text": "", "digests": { "md5": "5ee39a08d4ad7f0621d161433edf1d1d", "sha256": "8002be9c0843372db26db70ab10fde07a424faaff54d6526562dbe133cf62dd7" }, "downloads": -1, "filename": "influxable-0.0.1a1.tar.gz", "has_sig": false, "md5_digest": "5ee39a08d4ad7f0621d161433edf1d1d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 3465, "upload_time": "2019-08-30T22:49:57", "upload_time_iso_8601": "2019-08-30T22:49:57.630153Z", "url": "https://files.pythonhosted.org/packages/19/7e/f49060c039957a4c489842f2be2f4c0b7935a0352bdc945001da39cade16/influxable-0.0.1a1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "1368f32f793908564c892da080c8cfc2", "sha256": "90ca121c8274e0a03ec85b83eaad4db8e9a78e99ba76246dcae0e0de31aef18f" }, "downloads": -1, "filename": "influxable-1.0.0.tar.gz", "has_sig": false, "md5_digest": "1368f32f793908564c892da080c8cfc2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 12485, "upload_time": "2019-09-20T12:32:17", "upload_time_iso_8601": "2019-09-20T12:32:17.016754Z", "url": "https://files.pythonhosted.org/packages/e2/15/83f1cfc56f542eae7b97d6f3f9969a95e62a1df95dcfd8cc8dae6b4ef3b0/influxable-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0a0": [ { "comment_text": "", "digests": { "md5": "ea6e0167c1a4e5a0ceb956ff247dcb42", "sha256": "00dba07dfb8866b2642d797ebae977efa2ab2dae90ab047be132a776b7c27e6b" }, "downloads": -1, "filename": "influxable-1.0.0a0.tar.gz", "has_sig": false, "md5_digest": "ea6e0167c1a4e5a0ceb956ff247dcb42", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 12463, "upload_time": "2019-09-20T12:53:43", "upload_time_iso_8601": "2019-09-20T12:53:43.214781Z", "url": "https://files.pythonhosted.org/packages/f6/78/2ad513db09a9c173aa02c564fc85f04a64a475529d946af3deb6382046cb/influxable-1.0.0a0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0b0": [ { "comment_text": "", "digests": { "md5": "16d40424ee74626a09a040539a76c6b2", "sha256": "9b49a8adb47e9bd04ca365e69d7ca80c223fc39503dea1e84c4a49dfbeb4d5db" }, "downloads": -1, "filename": "influxable-1.0.0b0.tar.gz", "has_sig": false, "md5_digest": "16d40424ee74626a09a040539a76c6b2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 12473, "upload_time": "2019-09-20T13:01:00", "upload_time_iso_8601": "2019-09-20T13:01:00.981011Z", "url": "https://files.pythonhosted.org/packages/b9/ea/0af4125f830dfdc5ae92f4b1dde30a6c0b0f599c784191fdfa25d90e4f5d/influxable-1.0.0b0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0rc0": [ { "comment_text": "", "digests": { "md5": "f24b2ff776158365fa2e4babd9df718b", "sha256": "4b30a3016b36474af5de8854eab0dd171f91c0bd2895440a647639da66e102e3" }, "downloads": -1, "filename": "influxable-1.0.0rc0.tar.gz", "has_sig": false, "md5_digest": "f24b2ff776158365fa2e4babd9df718b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 13272, "upload_time": "2019-09-20T13:06:22", "upload_time_iso_8601": "2019-09-20T13:06:22.696288Z", "url": "https://files.pythonhosted.org/packages/b6/53/49c04f5b7b491d7e200e00b426c465bcbd8f60a3ef565d7a35d8a5439139/influxable-1.0.0rc0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "bc86f939193044d5099972ad8ecbf41c", "sha256": "92b3c079cf8643cecb22460d21a9244b599df6933f51f01ebfa46a1920891b64" }, "downloads": -1, "filename": "influxable-1.0.1.tar.gz", "has_sig": false, "md5_digest": "bc86f939193044d5099972ad8ecbf41c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 13420, "upload_time": "2019-09-20T18:40:00", "upload_time_iso_8601": "2019-09-20T18:40:00.204354Z", "url": "https://files.pythonhosted.org/packages/4b/98/fc9a83b94f115ba45cb3555bbc15f71a570b294137a478f046f14b69d368/influxable-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "85b9411951cc9af2a73f31426109f0de", "sha256": "eefc884293489c8e08ab9fa0b95e06b789df0a8ba07bb99b55320330ed158a69" }, "downloads": -1, "filename": "influxable-1.0.2.tar.gz", "has_sig": false, "md5_digest": "85b9411951cc9af2a73f31426109f0de", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 13495, "upload_time": "2019-09-22T22:01:30", "upload_time_iso_8601": "2019-09-22T22:01:30.569778Z", "url": "https://files.pythonhosted.org/packages/42/29/a48b216a1fcbf65c73b96013d0c71e4198bdc4292d112ca2f796b611c397/influxable-1.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "1af1f80883650bac0ad2775a30dc6180", "sha256": "6ac7c700091144a1aa0fe7f0dd304f29d681b5bb24c268b0d5abee35bf590a14" }, "downloads": -1, "filename": "influxable-1.0.3.tar.gz", "has_sig": false, "md5_digest": "1af1f80883650bac0ad2775a30dc6180", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 18291, "upload_time": "2019-09-23T21:28:09", "upload_time_iso_8601": "2019-09-23T21:28:09.242158Z", "url": "https://files.pythonhosted.org/packages/bc/0a/237654a7a235e3f0e66b9d0678ed324329d94571c49802fe6387562196a5/influxable-1.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "60db0f70e8dc915a62b13d0308514a97", "sha256": "84d5bbf47b75ec27f8e157924a6faf11aec3676e8ed4840c69dd7e832284fd8b" }, "downloads": -1, "filename": "influxable-1.0.4.tar.gz", "has_sig": false, "md5_digest": "60db0f70e8dc915a62b13d0308514a97", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 19384, "upload_time": "2019-10-02T13:26:29", "upload_time_iso_8601": "2019-10-02T13:26:29.257879Z", "url": "https://files.pythonhosted.org/packages/76/c6/83df0b55f88ed9371dbe0dac99450a79f73654018f5f5580912014b14a65/influxable-1.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "9f34d8e026b023ef2746934b716b916c", "sha256": "1d2fb7a8c199bbf6d09849187e49c8b85bd7d7a79f1b66444780de669e449510" }, "downloads": -1, "filename": "influxable-1.1.0.tar.gz", "has_sig": false, "md5_digest": "9f34d8e026b023ef2746934b716b916c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 28714, "upload_time": "2019-10-23T12:41:04", "upload_time_iso_8601": "2019-10-23T12:41:04.399963Z", "url": "https://files.pythonhosted.org/packages/24/19/02efaa799d1a66492f8957daa089c5b5832ee6a2484a55d506d0be2a4742/influxable-1.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "54abe08b84b2c5ea3f92098af8fe3844", "sha256": "0543882c5277d0e6e21448aef970bc52a61fff7b8f09f866aceb0210d79d3dde" }, "downloads": -1, "filename": "influxable-1.1.1-py3.7.egg", "has_sig": false, "md5_digest": "54abe08b84b2c5ea3f92098af8fe3844", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.0.*", "size": 86857, "upload_time": "2019-11-03T13:00:37", "upload_time_iso_8601": "2019-11-03T13:00:37.627895Z", "url": "https://files.pythonhosted.org/packages/ca/0e/9da3505d252cb6e9db05089e5c235c4ebb4ac7cab40e0a98deb9d35bc4bc/influxable-1.1.1-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "019a6708969fb52c515acd1a908f9814", "sha256": "e930b3f76dec05ca503158f47d798c004ccbbaa0bd22c0ca1104b22d0e8667a2" }, "downloads": -1, "filename": "influxable-1.1.1.tar.gz", "has_sig": false, "md5_digest": "019a6708969fb52c515acd1a908f9814", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 46520, "upload_time": "2019-11-03T13:00:41", "upload_time_iso_8601": "2019-11-03T13:00:41.335231Z", "url": "https://files.pythonhosted.org/packages/51/c4/233840291059603bf4fb5d98bc8f0ef3a31b5a7767a7d1ae7542b191e5a3/influxable-1.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "3c5d8de753efdad7be3bd43a68fc5756", "sha256": "4a6710de474e8e2ff1bcd20b3da0dd0d76b19c5bb1d55b1a97d06b1fdc46ffd5" }, "downloads": -1, "filename": "influxable-1.1.2-py3.7.egg", "has_sig": false, "md5_digest": "3c5d8de753efdad7be3bd43a68fc5756", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.0.*", "size": 91879, "upload_time": "2019-11-20T20:18:39", "upload_time_iso_8601": "2019-11-20T20:18:39.873562Z", "url": "https://files.pythonhosted.org/packages/41/81/e31eaa0d1fd09e801dd67afa20eca9abac513e6e380be4490437de024318/influxable-1.1.2-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1c673e9956cf5b1623f19d23766a35e3", "sha256": "04f8a52531c8fa7feb2b0a766e244e45e78d492de1df36b981fdd9c216baec47" }, "downloads": -1, "filename": "influxable-1.1.2.tar.gz", "has_sig": false, "md5_digest": "1c673e9956cf5b1623f19d23766a35e3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 48207, "upload_time": "2019-11-20T20:18:42", "upload_time_iso_8601": "2019-11-20T20:18:42.705259Z", "url": "https://files.pythonhosted.org/packages/4e/48/7d019f374af5898c0408ed5411865bf17fbb34226e8fd62c79c0e6f695c5/influxable-1.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "588e6200f07cc6b92a0d5383ec55b0cc", "sha256": "9a41debc47c103562c0ed23d4b8f7445673cbb4a467a595770820b7c965d5a55" }, "downloads": -1, "filename": "influxable-1.2.0-py3.7.egg", "has_sig": false, "md5_digest": "588e6200f07cc6b92a0d5383ec55b0cc", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.0.*", "size": 96233, "upload_time": "2019-12-13T08:41:01", "upload_time_iso_8601": "2019-12-13T08:41:01.435617Z", "url": "https://files.pythonhosted.org/packages/98/65/ff1a52592740af1f3c44f094ec3f5a7429421aa233b846c6d6d2c7ec72f7/influxable-1.2.0-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "791d0f999e6a168cfd3bf046c948e5b4", "sha256": "78ed0026959efdcb93caca9369a3495819f4736d498dd5340b542fa574db4566" }, "downloads": -1, "filename": "influxable-1.2.0.tar.gz", "has_sig": false, "md5_digest": "791d0f999e6a168cfd3bf046c948e5b4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 49869, "upload_time": "2019-12-13T08:41:04", "upload_time_iso_8601": "2019-12-13T08:41:04.908853Z", "url": "https://files.pythonhosted.org/packages/99/75/f811551e52d8b88cd00d9a1a789dc1690c5c478905b7c83753943a834e66/influxable-1.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "2dea4af79cfec2f9bdd06440a6e69469", "sha256": "efb8989a8f2275ed47eacf7fd7bdf7f169195feda7d1b46c5b458d023c3d87c0" }, "downloads": -1, "filename": "influxable-1.2.1-py3.7.egg", "has_sig": false, "md5_digest": "2dea4af79cfec2f9bdd06440a6e69469", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.0.*", "size": 96802, "upload_time": "2020-11-20T15:05:16", "upload_time_iso_8601": "2020-11-20T15:05:16.750258Z", "url": "https://files.pythonhosted.org/packages/f2/b0/0a1235fd43c59073264600a31cc5efcdf29f6892f81bef0883311c42246c/influxable-1.2.1-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "36f01a361abffe1aa16c1e3393ea4075", "sha256": "6cfe2d77289985b96cf677c5391519291a2cdc93566b0d1ccef80203e7e726f7" }, "downloads": -1, "filename": "influxable-1.2.1.tar.gz", "has_sig": false, "md5_digest": "36f01a361abffe1aa16c1e3393ea4075", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 51371, "upload_time": "2020-11-20T15:05:19", "upload_time_iso_8601": "2020-11-20T15:05:19.130780Z", "url": "https://files.pythonhosted.org/packages/d0/a4/d783eacb599b3a59327a75e8fb2ea115171a58ebd656f707f04eabd48cdc/influxable-1.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "8b4c12a5cb07875a3a1ab8f75510c42b", "sha256": "708f7255b93e0aba4c6cc2bb6e930b7791b1fd637d43ecd22a54f4c3df290931" }, "downloads": -1, "filename": "influxable-1.3.0.tar.gz", "has_sig": false, "md5_digest": "8b4c12a5cb07875a3a1ab8f75510c42b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 55487, "upload_time": "2020-12-02T22:32:37", "upload_time_iso_8601": "2020-12-02T22:32:37.417303Z", "url": "https://files.pythonhosted.org/packages/26/e7/7671ca570ec37a11179f965497f1c3324d6eef047718c3ccd7627854972e/influxable-1.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "ae09bd20c8de3acb83dfc89bf017036a", "sha256": "dc9942d01f236e34821b3ee30ced6c8d8427792e96c3fa16dd92ed18489e4f5b" }, "downloads": -1, "filename": "influxable-1.3.1-py3.7.egg", "has_sig": false, "md5_digest": "ae09bd20c8de3acb83dfc89bf017036a", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.0.*", "size": 108898, "upload_time": "2021-01-26T12:48:14", "upload_time_iso_8601": "2021-01-26T12:48:14.747905Z", "url": "https://files.pythonhosted.org/packages/e0/82/1c8092a68801a893c3322985eaecfa3bac970b0cbb258ed092538f423914/influxable-1.3.1-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ee96d21a60f5e99a147fcfa30873e510", "sha256": "ff97c1391c574549dc94c9e91fead304336469c9792bdc828b3e34539839a001" }, "downloads": -1, "filename": "influxable-1.3.1.tar.gz", "has_sig": false, "md5_digest": "ee96d21a60f5e99a147fcfa30873e510", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 55497, "upload_time": "2021-01-26T12:48:18", "upload_time_iso_8601": "2021-01-26T12:48:18.592009Z", "url": "https://files.pythonhosted.org/packages/0e/f6/72758d792fb9898b33f902e5dcf765958d3b6bc88490b4b8d80d9d23ef67/influxable-1.3.1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ae09bd20c8de3acb83dfc89bf017036a", "sha256": "dc9942d01f236e34821b3ee30ced6c8d8427792e96c3fa16dd92ed18489e4f5b" }, "downloads": -1, "filename": "influxable-1.3.1-py3.7.egg", "has_sig": false, "md5_digest": "ae09bd20c8de3acb83dfc89bf017036a", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.0.*", "size": 108898, "upload_time": "2021-01-26T12:48:14", "upload_time_iso_8601": "2021-01-26T12:48:14.747905Z", "url": "https://files.pythonhosted.org/packages/e0/82/1c8092a68801a893c3322985eaecfa3bac970b0cbb258ed092538f423914/influxable-1.3.1-py3.7.egg", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ee96d21a60f5e99a147fcfa30873e510", "sha256": "ff97c1391c574549dc94c9e91fead304336469c9792bdc828b3e34539839a001" }, "downloads": -1, "filename": "influxable-1.3.1.tar.gz", "has_sig": false, "md5_digest": "ee96d21a60f5e99a147fcfa30873e510", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.0.*", "size": 55497, "upload_time": "2021-01-26T12:48:18", "upload_time_iso_8601": "2021-01-26T12:48:18.592009Z", "url": "https://files.pythonhosted.org/packages/0e/f6/72758d792fb9898b33f902e5dcf765958d3b6bc88490b4b8d80d9d23ef67/influxable-1.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }