mirror of
https://github.com/Infinidat/infi.clickhouse_orm.git
synced 2024-11-27 19:23:43 +03:00
59 lines
2.2 KiB
Markdown
59 lines
2.2 KiB
Markdown
|
What's New in Version 2
|
||
|
=======================
|
||
|
|
||
|
## Python 3.5+ Only
|
||
|
|
||
|
This version of the ORM no longer support Python 2.
|
||
|
|
||
|
## New flexible syntax for database expressions and functions
|
||
|
|
||
|
Expressions that use model fields, database functions and Python operators are now first-class citizens of the ORM. They provide infinite expressivity and flexibility when defining models and generating queries.
|
||
|
|
||
|
Example of expressions in model definition:
|
||
|
```python
|
||
|
class Temperature(Model):
|
||
|
|
||
|
station_id = UInt16Field()
|
||
|
timestamp = DateTimeField(default=F.now()) # function as default value
|
||
|
degrees_celsius = Float32Field()
|
||
|
degrees_fahrenheit = Float32Field(alias=degrees_celsius * 1.8 + 32) # expression as field alias
|
||
|
|
||
|
# expressions in engine definition
|
||
|
engine = MergeTree(partition_key=[F.toYYYYMM(timestamp)], order_by=[station_id, timestamp])
|
||
|
```
|
||
|
|
||
|
Example of expressions in queries:
|
||
|
```python
|
||
|
db = Database('default')
|
||
|
start = F.toStartOfMonth(F.now())
|
||
|
expr = (Temperature.timestamp > start) & (Temperature.station_id == 123) & (Temperature.degrees_celsius > 30)
|
||
|
for t in Temperature.objects_in(db).filter(expr):
|
||
|
print(t.timestamp, t.degrees_celsius)
|
||
|
```
|
||
|
|
||
|
See [Expressions](expressions.md).
|
||
|
|
||
|
## Support for IPv4 and IPv6 fields
|
||
|
|
||
|
Two new fields classes were added: `IPv4Field` and `IPv6Field`. Their values are represented by Python's `ipaddress.IPv4Address` and `ipaddress.IPv6Address`.
|
||
|
|
||
|
See [Field Types](field_types.md).
|
||
|
|
||
|
## Automatic generation of models by inspecting existing tables
|
||
|
|
||
|
It is now easy to generate a model class on the fly for an existing table in the database using `Database.get_model_for_table`. This is particularly useful for querying system tables, for example:
|
||
|
```python
|
||
|
QueryLog = db.get_model_for_table('query_log', system_table=True)
|
||
|
for row in QueryLog.objects_in(db).filter(QueryLog.query_duration_ms > 10000):
|
||
|
print(row.query)
|
||
|
```
|
||
|
|
||
|
## Convenient ways to import ORM classes
|
||
|
|
||
|
You can now import all ORM classes directly from `infi.clickhouse_orm`, without worrying about sub-modules. For example:
|
||
|
```python
|
||
|
from infi.clickhouse_orm import Database, Model, StringField, DateTimeField, MergeTree
|
||
|
```
|
||
|
See [Importing ORM Classes](importing_orm_classes.md).
|
||
|
|