From b62c08747f3af3111879dbf0f534d9a20fd65765 Mon Sep 17 00:00:00 2001 From: sswest Date: Wed, 1 Jun 2022 12:13:56 +0800 Subject: [PATCH] Replacing httpx as the underlying request library --- pyproject.toml | 4 ++-- src/clickhouse_orm/database.py | 33 ++++++++++++++++++--------------- tests/test_constraints.py | 4 ++-- tests/test_dictionaries.py | 2 +- tests/test_engines.py | 2 +- tests/test_indexes.py | 2 +- tests/test_join.py | 2 +- tests/test_mutations.py | 2 +- 8 files changed, 27 insertions(+), 24 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4736282..8da68ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,12 +15,12 @@ classifiers = [ "Topic :: Database" ] dependencies = [ - "requests", + "httpx >= 0.18.0", "pytz", "iso8601 >= 0.1.12", "setuptools" ] -version = "0.0.3" +version = "0.0.4" [tool.setuptools.packages.find] where = ["src"] diff --git a/src/clickhouse_orm/database.py b/src/clickhouse_orm/database.py index 4698a5c..9a13eba 100644 --- a/src/clickhouse_orm/database.py +++ b/src/clickhouse_orm/database.py @@ -8,7 +8,7 @@ from collections import namedtuple from typing import Type, Optional, Generator, Union, Any import pytz -import requests +import httpx from .models import ModelBase, MODEL from .utils import parse_tsv, import_submodules @@ -88,7 +88,7 @@ class Database(object): inserting data and other operations. """ - def __init__(self, db_name, db_url='http://localhost:8123/', + def __init__(self, db_name, db_url='http://localhost:18123/', username=None, password=None, readonly=False, autocreate=True, timeout=60, verify_ssl_cert=True, log_statements=False): """ @@ -109,8 +109,7 @@ class Database(object): self.db_url = db_url self.readonly = False self.timeout = timeout - self.request_session = requests.Session() - self.request_session.verify = verify_ssl_cert + self.request_session = httpx.Client(verify=verify_ssl_cert) if username: self.request_session.auth = (username, password or '') self.log_statements = log_statements @@ -295,14 +294,17 @@ class Database(object): query += ' FORMAT TabSeparatedWithNamesAndTypes' query = self._substitute(query, model_class) r = self._send(query, settings, True) - lines = r.iter_lines() - field_names = parse_tsv(next(lines)) - field_types = parse_tsv(next(lines)) - model_class = model_class or ModelBase.create_ad_hoc_model(zip(field_names, field_types)) - for line in lines: - # skip blank line left by WITH TOTALS modifier - if line: - yield model_class.from_tsv(line, field_names, self.server_timezone, self) + try: + lines = r.iter_lines() + field_names = parse_tsv(next(lines)) + field_types = parse_tsv(next(lines)) + model_class = model_class or ModelBase.create_ad_hoc_model(zip(field_names, field_types)) + for line in lines: + # skip blank line left by WITH TOTALS modifier + if line: + yield model_class.from_tsv(line, field_names, self.server_timezone, self) + finally: + r.close() def raw(self, query: str, settings: Optional[dict] = None, stream: bool = False) -> str: """ @@ -409,10 +411,11 @@ class Database(object): if self.log_statements: logger.info(data) params = self._build_params(settings) - r = self.request_session.post( - self.db_url, params=params, data=data, stream=stream, timeout=self.timeout + request = self.request_session.build_request( + method='POST', url=self.db_url, data=data, params=params ) - if r.status_code != 200: + r = self.request_session.send(request, stream=stream) + if isinstance(r, httpx.Response) and r.status_code != 200: raise ServerError(r.text) return r diff --git a/tests/test_constraints.py b/tests/test_constraints.py index 1b5892d..0f9610c 100644 --- a/tests/test_constraints.py +++ b/tests/test_constraints.py @@ -1,7 +1,7 @@ import unittest -from infi.clickhouse_orm import * -from .base_test_with_data import Person +from clickhouse_orm import * +from tests.base_test_with_data import Person class ConstraintsTest(unittest.TestCase): diff --git a/tests/test_dictionaries.py b/tests/test_dictionaries.py index c031d2e..b7c4a36 100644 --- a/tests/test_dictionaries.py +++ b/tests/test_dictionaries.py @@ -1,7 +1,7 @@ import unittest import logging -from infi.clickhouse_orm import * +from clickhouse_orm import * class DictionaryTestMixin: diff --git a/tests/test_engines.py b/tests/test_engines.py index b2e0e5d..d39ec0c 100644 --- a/tests/test_engines.py +++ b/tests/test_engines.py @@ -1,7 +1,7 @@ import unittest import datetime -from infi.clickhouse_orm import * +from clickhouse_orm import * import logging logging.getLogger("requests").setLevel(logging.WARNING) diff --git a/tests/test_indexes.py b/tests/test_indexes.py index 0dccaea..63ce7c3 100644 --- a/tests/test_indexes.py +++ b/tests/test_indexes.py @@ -1,6 +1,6 @@ import unittest -from infi.clickhouse_orm import * +from clickhouse_orm import * class IndexesTest(unittest.TestCase): diff --git a/tests/test_join.py b/tests/test_join.py index 48da1b3..b00c523 100644 --- a/tests/test_join.py +++ b/tests/test_join.py @@ -2,7 +2,7 @@ import unittest import json -from infi.clickhouse_orm import database, engines, fields, models +from clickhouse_orm import database, engines, fields, models class JoinTest(unittest.TestCase): diff --git a/tests/test_mutations.py b/tests/test_mutations.py index 874c7bd..ec291b9 100644 --- a/tests/test_mutations.py +++ b/tests/test_mutations.py @@ -1,5 +1,5 @@ import unittest -from infi.clickhouse_orm import F +from clickhouse_orm import F from .base_test_with_data import * from time import sleep