欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Python使用ch-orm對(duì)ClickHouse簡(jiǎn)單查詢及寫(xiě)入

引言

前不久新項(xiàng)目中需要用到ClickHouse,作為一個(gè)合格的Python程序員,首先當(dāng)然是找找有沒(méi)有合適的輪子。

都勻ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!

翻了一圈,infi.clickhouse_orm在功能和易用性上沒(méi)有明顯的短板,其ORM API對(duì)后端程序員格外親切??上е鞣种б呀?jīng)八個(gè)月沒(méi)有更新了,據(jù)聞核心開(kāi)發(fā)者已離職,而infi.clickhouse_orm尚不支持一些我需要的新功能如Geo類型和函數(shù),基于這些原因,這篇文章的主角ch-orm也就誕生了。

ch-orm庫(kù)fork自infi.clickhouse_orm(v2.1.1)。

與infi相比,ch-orm支持同步和異步兩種方式與ClickHouse服務(wù)器交互,它添加了一些新功能:

  • 異步支持(AioDatabase)

    • 為所有同步API提供async接口
  • 類型注解

    • 大部分對(duì)外API實(shí)現(xiàn)了類型注解
  • 新的類型支持

    • Tuple
    • Geo類型;Point、Ring等
  • 新的函數(shù)支持

    • Geo函數(shù)等
  • 支持創(chuàng)建臨時(shí)表(TemporaryModel)

    • session會(huì)話

需要提醒的是,ch-orm僅使用ClickHouse的http協(xié)議,不支持TCP協(xié)議。更多細(xì)節(jié)參見(jiàn)Github上的文檔。

快速開(kāi)始

1. 安裝

通過(guò)pip安裝ch-orm

pip install ch-orm

2. 定義一個(gè)模型

雖然pypi的庫(kù)名為ch-orm,但在代碼中需要導(dǎo)入的是clickhouse_orm

from clickhouse_orm import Database, Model, MergeTree
from clickhouse_orm.fields import (
    StringField, Int32Field, UUIDField, Int8Field
)
from clickhouse_orm.contrib.geo.fields import PointField

class Residence(Model):
    uuid = UUIDField()
    residence_type = Int8Field()
    geo = PointField(db_column='geo_wgs84')
    geohash_wgs84 = StringField()
    province = StringField()
    city = StringField()
    district = StringField()
    poi_id = Int32Field(default=1000)
    poi_name = StringField()
    p_geo_bd09 = PointField()

    engine = MergeTree(partition_key=('uuid', ), order_by=('uuid', ))

    @classmethod
    def table_name(cls):
        return 'residence'

上面定義了一個(gè)Residence模型,它將會(huì)映射到ClickHouse上的residence表,而Residence中眾多Field屬性則被映射為表中的列,可以在Python中對(duì)Residence實(shí)例進(jìn)行操作進(jìn)而處理ClickHouse(沒(méi)錯(cuò),就像Django ORM所做的那樣)

接下來(lái),先假定此時(shí)residence尚不存在,借助Residence來(lái)創(chuàng)建它。

創(chuàng)建數(shù)據(jù)表

想要對(duì)數(shù)據(jù)庫(kù)執(zhí)行操作,首先必須實(shí)例化一個(gè)Database對(duì)象(或AioDatabase),可以粗淺的理解為它和數(shù)據(jù)庫(kù)連接屬于一類抽象,內(nèi)部實(shí)現(xiàn)對(duì)后端數(shù)據(jù)庫(kù)的交互。

from clickhouse_orm.database import Database
from clickhouse_orm.aio.database import AioDatabase

# 以同步方式創(chuàng)建數(shù)據(jù)庫(kù)
sync_db = Database('db-test', db_url='http://localhost:8123/')
sync_db.create_table(Residence)


# 以異步方式創(chuàng)建數(shù)據(jù)庫(kù)
async def main():
    async_db = AioDatabase('db-test', db_url='http://localhost:8123/')
    # 異步模型下需要主動(dòng)執(zhí)行init方法初始化
    await async_db.init()
    await async_db.create_table(Residence)

此時(shí),db-test庫(kù)內(nèi)應(yīng)當(dāng)出現(xiàn)了一個(gè)名為residence的表。

插入數(shù)據(jù)

ClickHouse在數(shù)據(jù)寫(xiě)入性能表現(xiàn)十分優(yōu)異,ch-orm能輕易處理寫(xiě)入數(shù)據(jù)需求

以寫(xiě)入100萬(wàn)條數(shù)據(jù)為例,使用生成器創(chuàng)建100萬(wàn)個(gè)Residence隨機(jī)實(shí)例

import uuid

from clickhouse_orm.contrib.geo.fields import Point

# 同步寫(xiě)入100萬(wàn)條residence
sync_db.insert(
    (Residence(uuid=str(uuid.uuid4()), geo=Point(120, 20)) for _ in range()),
    batch_size=
)


# 異步寫(xiě)入100萬(wàn)條residence
async def insert():
    ...
    await async_db.insert(
        (Residence(uuid=str(uuid.uuid4()), geo=Point(120, 20)) for _ in range()),
        batch_size=
    )

示例中僅對(duì)uuidgeo列進(jìn)行賦值,其他字段會(huì)被設(shè)置為默認(rèn)值(而非None值)

可以看看residence表中有多少條數(shù)據(jù)

# 同步方式查詢Residence行數(shù)
Residence.objects_in(sync_db).count()


# 異步方式查詢Residence行數(shù)
async def read_count():
    ...
    await Residence.objects_in(async_db).count()

查詢API

ch-orm實(shí)現(xiàn)了QuerySet,暴露API基本參照Django設(shè)計(jì)的,如前述的獲取表行數(shù)的count()方法就來(lái)自QuerySet。

與Django不同的是,ch-orm僅將QuerySet作為查詢實(shí)例,不具備查詢結(jié)果緩存功能,這代表如果對(duì)一個(gè)QuerySet對(duì)象執(zhí)行兩次迭代,與后端數(shù)據(jù)庫(kù)的交互將變成兩次而非一次。

可以通過(guò)Model的類方法objects_in獲得一個(gè)QuerySet實(shí)例,接著來(lái)查詢uuid="48d75e4d-8e6f-4acd-a2e9-f4c3059b5b30"的數(shù)據(jù)

# 同步API
queryset = Residence.objects_in(sync_db)
queryset = queryset.filter(Residence.uuid == "48d75e4d-8e6f-4acd-a2e9-f4c3059b5b30")
result = list(queryset)

# 對(duì)于異步API
queryset = Residence.objects_in(async_db)
queryset = queryset.filter(Residence.uuid == "48d75e4d-8e6f-4acd-a2e9-f4c3059b5b30")
result = [_ async for _ in queryset]

真正的查詢請(qǐng)求是在對(duì)queryset迭代時(shí)處理的,因此下列兩行代碼不會(huì)與數(shù)據(jù)庫(kù)后端進(jìn)行交互

queryset = Residence.objects_in(sync_db)
queryset = queryset.filter(Residence.uuid == "48d75e4d-8e6f-4acd-a2e9-f4c3059b5b30")

最終得到一個(gè)由Residence實(shí)例的組成的結(jié)果列表result。

3. 略微復(fù)雜功能

ch-orm具備日常使用的大多數(shù)場(chǎng)景功能

  • 執(zhí)行原生查詢并創(chuàng)建動(dòng)態(tài)對(duì)象

  • 現(xiàn)有表生成模型類

  • F函數(shù)

  • Q查詢

  • Aggregation 聚合查詢

  • order_by 查詢排序

  • distinct 結(jié)果去重

  • Pagination 查詢分頁(yè)

  • 表引擎

  • ...

這些內(nèi)容Github倉(cāng)庫(kù)有相應(yīng)的文檔,限于本文篇幅這里就不再過(guò)多介紹。

文章標(biāo)題:Python使用ch-orm對(duì)ClickHouse簡(jiǎn)單查詢及寫(xiě)入
分享地址:http://chinadenli.net/article10/dsogjgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈網(wǎng)站維護(hù)、Google、網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
精品国产亚洲av成人一区| 日韩专区欧美中文字幕| 欧美欧美欧美欧美一区| 少妇福利视频一区二区| 91人妻人人澡人人人人精品| 亚洲成人免费天堂诱惑| 午夜福利视频六七十路熟女| 日韩毛片视频免费观看| 久久亚洲精品中文字幕| 人妻少妇系列中文字幕| 国产成人在线一区二区三区| 四季av一区二区播放| 国产亚洲不卡一区二区| 中文精品人妻一区二区| 九九热精彩视频在线播放| 日韩精品毛片视频免费看| 大香蕉网国产在线观看av| 国产成人综合亚洲欧美日韩| 国产一区国产二区在线视频| 日韩免费国产91在线| 深夜视频成人在线观看| 亚洲精品成人午夜久久| 精品欧美一区二区三久久| 久久亚洲精品成人国产| 国产精品亚洲二区三区| 日韩女优精品一区二区三区| 99热在线播放免费观看| 搡老熟女老女人一区二区| 乱女午夜精品一区二区三区| 国产欧美一区二区另类精品| 国产午夜在线精品视频| 免费精品国产日韩热久久| 我要看日本黄色小视频| 欧美自拍系列精品在线| 亚洲天堂久久精品成人| 日韩成人午夜福利免费视频| 日韩高清一区二区三区四区| 国产精品激情在线观看| 中文字幕一区久久综合| 国产欧美另类激情久久久| 国产一区二区三区成人精品|