mirror of
https://github.com/Infinidat/infi.clickhouse_orm.git
synced 2025-08-02 03:00:09 +03:00
build 0.2.0
This commit is contained in:
parent
1a366ce625
commit
6286185a45
63
README.md
63
README.md
|
@ -4,70 +4,19 @@ This repository expects to use more type hints, and will drop support for Python
|
||||||
|
|
||||||
Supports both synchronous and asynchronous ways to interact with the clickhouse server. Means you can use asyncio to perform asynchronous queries, although the asynchronous mode is not well tested.
|
Supports both synchronous and asynchronous ways to interact with the clickhouse server. Means you can use asyncio to perform asynchronous queries, although the asynchronous mode is not well tested.
|
||||||
|
|
||||||
| Build | [](https://github.com/sswest/ch-orm/actions?query=workflow:ci)[](https://coveralls.io/github/sswest/ch-orm?branch=develop) |
|
|
||||||
| ------- | ------------------------------------------------------------ |
|
| Build | [](https://github.com/sswest/ch-orm/actions?query=Python+3.7+Tests)[](https://github.com/sswest/ch-orm/actions?query=Python+3.8+Tests)[](https://github.com/sswest/ch-orm/actions?query=Python+3.9+Tests)[](https://github.com/sswest/ch-orm/actions?query=Python+3.10+Tests) |
|
||||||
| Package | [](https://pypi.python.org/pypi/ch-orm)[](https://pypi.python.org/pypi/ch-orm)[](https://pypi.python.org/pypi/ch-orm) |
|
| ----------- | ------------------------------------------------------------ |
|
||||||
|
| **Package** | [](https://pypi.python.org/pypi/ch-orm)[](https://pypi.python.org/pypi/ch-orm)[](https://pypi.python.org/pypi/ch-orm)[](https://coveralls.io/github/sswest/ch-orm?branch=master) |
|
||||||
|
| **Docs** | [](http://sswest.github.io/ch-orm) |
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
============
|
============
|
||||||
|
|
||||||
This project is simple ORM for working with the [ClickHouse database](https://clickhouse.yandex/).
|
This project is simple ORM for working with the [ClickHouse database](https://clickhouse.yandex/).
|
||||||
|
|
||||||
It allows you to define model classes whose instances can be written to the database and read from it.
|
It allows you to define model classes whose instances can be written to the database and read from it.
|
||||||
|
|
||||||
First you have to install like this:
|
|
||||||
|
|
||||||
```
|
|
||||||
pip install ch-orm
|
|
||||||
```
|
|
||||||
|
|
||||||
Let's jump right in with a simple example of monitoring CPU usage. First we need to define the model class,
|
|
||||||
connect to the database and create a table for the model:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from clickhouse_orm import Database, Model, DateTimeField, UInt16Field, Float32Field, Memory, F
|
|
||||||
|
|
||||||
class CPUStats(Model):
|
|
||||||
|
|
||||||
timestamp = DateTimeField()
|
|
||||||
cpu_id = UInt16Field()
|
|
||||||
cpu_percent = Float32Field()
|
|
||||||
|
|
||||||
engine = Memory()
|
|
||||||
|
|
||||||
db = Database('demo')
|
|
||||||
db.create_table(CPUStats)
|
|
||||||
```
|
|
||||||
|
|
||||||
Now we can collect usage statistics per CPU, and write them to the database:
|
|
||||||
|
|
||||||
```python
|
|
||||||
import psutil, time, datetime
|
|
||||||
|
|
||||||
psutil.cpu_percent(percpu=True) # first sample should be discarded
|
|
||||||
while True:
|
|
||||||
time.sleep(1)
|
|
||||||
stats = psutil.cpu_percent(percpu=True)
|
|
||||||
timestamp = datetime.datetime.now()
|
|
||||||
db.insert([
|
|
||||||
CPUStats(timestamp=timestamp, cpu_id=cpu_id, cpu_percent=cpu_percent)
|
|
||||||
for cpu_id, cpu_percent in enumerate(stats)
|
|
||||||
])
|
|
||||||
```
|
|
||||||
|
|
||||||
Querying the table is easy, using either the query builder or raw SQL:
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Calculate what percentage of the time CPU 1 was over 95% busy
|
|
||||||
queryset = CPUStats.objects_in(db)
|
|
||||||
total = queryset.filter(CPUStats.cpu_id == 1).count()
|
|
||||||
busy = queryset.filter(CPUStats.cpu_id == 1, CPUStats.cpu_percent > 95).count()
|
|
||||||
print('CPU 1 was busy {:.2f}% of the time'.format(busy * 100.0 / total))
|
|
||||||
|
|
||||||
# Calculate the average usage per CPU
|
|
||||||
for row in queryset.aggregate(CPUStats.cpu_id, average=F.avg(CPUStats.cpu_percent)):
|
|
||||||
print('CPU {row.cpu_id}: {row.average:.2f}%'.format(row=row))
|
|
||||||
```
|
|
||||||
|
|
||||||
This and other examples can be found in the `examples` folder.
|
This and other examples can be found in the `examples` folder.
|
||||||
|
|
||||||
To learn more please visit the [documentation](docs/toc.md).
|
To learn more please visit the [documentation](docs/toc.md).
|
||||||
|
|
|
@ -24,7 +24,7 @@ dependencies = [
|
||||||
"iso8601 >= 0.1.12",
|
"iso8601 >= 0.1.12",
|
||||||
"setuptools"
|
"setuptools"
|
||||||
]
|
]
|
||||||
version = "0.1.1"
|
version = "0.2.0"
|
||||||
|
|
||||||
[tool.setuptools.packages.find]
|
[tool.setuptools.packages.find]
|
||||||
where = ["src"]
|
where = ["src"]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user