david8 0.dev4__tar.gz → 0.dev5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {david8-0.dev4 → david8-0.dev5}/PKG-INFO +17 -1
- david8-0.dev5/README.md +17 -0
- {david8-0.dev4 → david8-0.dev5}/david8/predicates.py +1 -1
- {david8-0.dev4 → david8-0.dev5}/david8.egg-info/PKG-INFO +17 -1
- {david8-0.dev4 → david8-0.dev5}/pyproject.toml +1 -1
- {david8-0.dev4 → david8-0.dev5}/tests/test_predicates.py +5 -5
- {david8-0.dev4 → david8-0.dev5}/tests/test_where_predicates.py +34 -13
- david8-0.dev4/README.md +0 -1
- {david8-0.dev4 → david8-0.dev5}/LICENSE +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/__init__.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/core/__init__.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/core/base_aliased.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/core/base_dialect.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/core/base_dml.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/core/base_params.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/core/base_query_builder.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/core/fn_generator.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/core/log.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/core/sql_92_join.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/expressions.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/functions.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/joins.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/logical_operators.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/param_styles.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/protocols/__init__.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/protocols/dialect.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/protocols/dml.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/protocols/query_builder.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8/protocols/sql.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8.egg-info/SOURCES.txt +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8.egg-info/dependency_links.txt +0 -0
- {david8-0.dev4 → david8-0.dev5}/david8.egg-info/top_level.txt +0 -0
- {david8-0.dev4 → david8-0.dev5}/setup.cfg +0 -0
- {david8-0.dev4 → david8-0.dev5}/tests/test_expressions.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/tests/test_functions.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/tests/test_group_by.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/tests/test_join.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/tests/test_logical_operators.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/tests/test_order_by.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/tests/test_select.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/tests/test_union.py +0 -0
- {david8-0.dev4 → david8-0.dev5}/tests/test_with_select.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: david8
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.dev5
|
|
4
4
|
Summary: Lightweight Python SQL query builder with support for multiple dialects: ClickHouse and PostgreSQL
|
|
5
5
|
Author-email: Danila Ganchar <danila.ganchar@gmail.com>
|
|
6
6
|
Maintainer-email: Danila Ganchar <danila.ganchar@gmail.com>
|
|
@@ -24,3 +24,19 @@ License-File: LICENSE
|
|
|
24
24
|
Dynamic: license-file
|
|
25
25
|
|
|
26
26
|
# david8
|
|
27
|
+
|
|
28
|
+
A fast, lightweight, and elegant SQL query builder for Python.
|
|
29
|
+
Designed with clarity and minimalism in mind, it provides a clean, expressive interface for constructing
|
|
30
|
+
SQL queries without sacrificing control or performance.
|
|
31
|
+
|
|
32
|
+
The builder automatically generates safe parameter placeholders and binds parameters for you, keeping your code
|
|
33
|
+
concise and secure.
|
|
34
|
+
|
|
35
|
+
Whether you're assembling simple filters or composing complex queries, this query builder gives you a
|
|
36
|
+
predictable and ergonomic workflow
|
|
37
|
+
|
|
38
|
+
- Zero dependencies
|
|
39
|
+
- Zero global objects
|
|
40
|
+
- Built-in base support for ClickHouse, PostgreSQL, DuckDB, and MySQL
|
|
41
|
+
|
|
42
|
+
See [Wiki](https://github.com/d-ganchar/david8/wiki)
|
david8-0.dev5/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# david8
|
|
2
|
+
|
|
3
|
+
A fast, lightweight, and elegant SQL query builder for Python.
|
|
4
|
+
Designed with clarity and minimalism in mind, it provides a clean, expressive interface for constructing
|
|
5
|
+
SQL queries without sacrificing control or performance.
|
|
6
|
+
|
|
7
|
+
The builder automatically generates safe parameter placeholders and binds parameters for you, keeping your code
|
|
8
|
+
concise and secure.
|
|
9
|
+
|
|
10
|
+
Whether you're assembling simple filters or composing complex queries, this query builder gives you a
|
|
11
|
+
predictable and ergonomic workflow
|
|
12
|
+
|
|
13
|
+
- Zero dependencies
|
|
14
|
+
- Zero global objects
|
|
15
|
+
- Built-in base support for ClickHouse, PostgreSQL, DuckDB, and MySQL
|
|
16
|
+
|
|
17
|
+
See [Wiki](https://github.com/d-ganchar/david8/wiki)
|
|
@@ -97,7 +97,7 @@ def le(column: str, value: int | float | ExprProtocol) -> PredicateProtocol:
|
|
|
97
97
|
def ne(column: str, value: int | float | str | ExprProtocol) -> PredicateProtocol:
|
|
98
98
|
return _LeftColRightParamPredicate(column, value, '!=')
|
|
99
99
|
|
|
100
|
-
def
|
|
100
|
+
def between(
|
|
101
101
|
column: str,
|
|
102
102
|
start: str | float | int | ExprProtocol,
|
|
103
103
|
end: str | float | int | ExprProtocol
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: david8
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.dev5
|
|
4
4
|
Summary: Lightweight Python SQL query builder with support for multiple dialects: ClickHouse and PostgreSQL
|
|
5
5
|
Author-email: Danila Ganchar <danila.ganchar@gmail.com>
|
|
6
6
|
Maintainer-email: Danila Ganchar <danila.ganchar@gmail.com>
|
|
@@ -24,3 +24,19 @@ License-File: LICENSE
|
|
|
24
24
|
Dynamic: license-file
|
|
25
25
|
|
|
26
26
|
# david8
|
|
27
|
+
|
|
28
|
+
A fast, lightweight, and elegant SQL query builder for Python.
|
|
29
|
+
Designed with clarity and minimalism in mind, it provides a clean, expressive interface for constructing
|
|
30
|
+
SQL queries without sacrificing control or performance.
|
|
31
|
+
|
|
32
|
+
The builder automatically generates safe parameter placeholders and binds parameters for you, keeping your code
|
|
33
|
+
concise and secure.
|
|
34
|
+
|
|
35
|
+
Whether you're assembling simple filters or composing complex queries, this query builder gives you a
|
|
36
|
+
predictable and ergonomic workflow
|
|
37
|
+
|
|
38
|
+
- Zero dependencies
|
|
39
|
+
- Zero global objects
|
|
40
|
+
- Built-in base support for ClickHouse, PostgreSQL, DuckDB, and MySQL
|
|
41
|
+
|
|
42
|
+
See [Wiki](https://github.com/d-ganchar/david8/wiki)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "david8"
|
|
3
|
-
version = "0.dev.
|
|
3
|
+
version = "0.dev.5"
|
|
4
4
|
description = "Lightweight Python SQL query builder with support for multiple dialects: ClickHouse and PostgreSQL"
|
|
5
5
|
authors = [{name = "Danila Ganchar", email = "danila.ganchar@gmail.com"}]
|
|
6
6
|
maintainers = [{name = "Danila Ganchar", email = "danila.ganchar@gmail.com"}]
|
|
@@ -2,7 +2,7 @@ from parameterized import parameterized
|
|
|
2
2
|
|
|
3
3
|
from david8.expressions import param, val
|
|
4
4
|
from david8.predicates import (
|
|
5
|
-
|
|
5
|
+
between,
|
|
6
6
|
eq,
|
|
7
7
|
eq_c,
|
|
8
8
|
eq_e,
|
|
@@ -30,14 +30,14 @@ class TestPredicates(BaseTest):
|
|
|
30
30
|
@parameterized.expand([
|
|
31
31
|
# between
|
|
32
32
|
(
|
|
33
|
-
|
|
33
|
+
between('age', 14, 18).as_('is_valid'),
|
|
34
34
|
'SELECT age BETWEEN %(p1)s AND %(p2)s AS is_valid',
|
|
35
|
-
|
|
35
|
+
{'p1': 14, 'p2': 18}
|
|
36
36
|
),
|
|
37
37
|
(
|
|
38
|
-
|
|
38
|
+
between('created_day', val('2025-01-01'), val('2026-01-01')),
|
|
39
39
|
"SELECT created_day BETWEEN '2025-01-01' AND '2026-01-01'",
|
|
40
|
-
|
|
40
|
+
{}
|
|
41
41
|
),
|
|
42
42
|
# eq
|
|
43
43
|
(
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
from parameterized import parameterized
|
|
2
|
+
|
|
3
|
+
from david8.expressions import col, val
|
|
1
4
|
from david8.predicates import (
|
|
2
|
-
|
|
5
|
+
between,
|
|
3
6
|
eq,
|
|
4
7
|
ge,
|
|
5
8
|
gt,
|
|
@@ -7,6 +10,7 @@ from david8.predicates import (
|
|
|
7
10
|
lt,
|
|
8
11
|
ne,
|
|
9
12
|
)
|
|
13
|
+
from david8.protocols.sql import PredicateProtocol
|
|
10
14
|
from tests.base_test import BaseTest
|
|
11
15
|
|
|
12
16
|
|
|
@@ -23,14 +27,13 @@ class TestWherePredicates(BaseTest):
|
|
|
23
27
|
gt('weight', 3.1),
|
|
24
28
|
lt('weight', 3.9),
|
|
25
29
|
ne('gender', 'f'),
|
|
26
|
-
between_c('last_visit', '2023', '2024'),
|
|
27
30
|
)
|
|
28
31
|
)
|
|
29
32
|
|
|
30
33
|
self.assertEqual(
|
|
31
34
|
query.get_sql(),
|
|
32
35
|
"SELECT * FROM cats WHERE color = %(p1)s AND age >= %(p2)s AND age <= %(p3)s AND weight > %(p4)s AND "
|
|
33
|
-
"weight < %(p5)s AND gender != %(p6)s
|
|
36
|
+
"weight < %(p5)s AND gender != %(p6)s"
|
|
34
37
|
)
|
|
35
38
|
|
|
36
39
|
self.assertEqual(
|
|
@@ -41,8 +44,6 @@ class TestWherePredicates(BaseTest):
|
|
|
41
44
|
'p4': 3.1,
|
|
42
45
|
'p5': 3.9,
|
|
43
46
|
'p6': 'f',
|
|
44
|
-
'p7': '2023',
|
|
45
|
-
'p8': '2024',
|
|
46
47
|
},
|
|
47
48
|
query.get_parameters()
|
|
48
49
|
)
|
|
@@ -57,30 +58,50 @@ class TestWherePredicates(BaseTest):
|
|
|
57
58
|
gt('weight', 3.1),
|
|
58
59
|
lt('weight', 3.9),
|
|
59
60
|
ne('gender', 'f'),
|
|
60
|
-
between_c('last_visit', '2023-01-01', '2024-01-01'),
|
|
61
|
-
between_c('sociality', 69, 96),
|
|
62
61
|
]:
|
|
63
62
|
query.where(predicate)
|
|
64
63
|
|
|
65
64
|
self.assertEqual(
|
|
66
65
|
query.get_sql(),
|
|
67
66
|
'SELECT * FROM cats WHERE color = %(p1)s AND age >= %(p2)s AND age <= %(p3)s AND weight > %(p4)s AND '
|
|
68
|
-
'weight < %(p5)s AND gender != %(p6)s
|
|
69
|
-
'BETWEEN %(p9)s AND %(p10)s'
|
|
67
|
+
'weight < %(p5)s AND gender != %(p6)s'
|
|
70
68
|
)
|
|
71
69
|
|
|
72
70
|
self.assertEqual(
|
|
73
71
|
{
|
|
74
72
|
'p1': 'ginger',
|
|
75
|
-
'p10': 96,
|
|
76
73
|
'p2': 2,
|
|
77
74
|
'p3': 3,
|
|
78
75
|
'p4': 3.1,
|
|
79
76
|
'p5': 3.9,
|
|
80
77
|
'p6': 'f',
|
|
81
|
-
'p7': '2023-01-01',
|
|
82
|
-
'p8': '2024-01-01',
|
|
83
|
-
'p9': 69,
|
|
84
78
|
},
|
|
85
79
|
query.get_parameters(),
|
|
86
80
|
)
|
|
81
|
+
|
|
82
|
+
@parameterized.expand([
|
|
83
|
+
(
|
|
84
|
+
between('last_visit', '2023-01-01', '2024-01-01'),
|
|
85
|
+
'SELECT last_visit BETWEEN %(p1)s AND %(p2)s',
|
|
86
|
+
{'p1': '2023-01-01', 'p2': '2024-01-01'},
|
|
87
|
+
),
|
|
88
|
+
(
|
|
89
|
+
between('sociality', 69, 96).as_('soc_level'),
|
|
90
|
+
'SELECT sociality BETWEEN %(p1)s AND %(p2)s AS soc_level',
|
|
91
|
+
{'p1': 69, 'p2': 96},
|
|
92
|
+
),
|
|
93
|
+
(
|
|
94
|
+
between('price', col('account_balance_free'), col('account_balance_total')),
|
|
95
|
+
'SELECT price BETWEEN account_balance_free AND account_balance_total',
|
|
96
|
+
{},
|
|
97
|
+
),
|
|
98
|
+
(
|
|
99
|
+
between('price', val(0.1), val(0.9)),
|
|
100
|
+
'SELECT price BETWEEN 0.1 AND 0.9',
|
|
101
|
+
{},
|
|
102
|
+
)
|
|
103
|
+
])
|
|
104
|
+
def test_between(self, b_expr: PredicateProtocol, exp_sql: str, exp_params: dict):
|
|
105
|
+
query = self.qb.select(b_expr)
|
|
106
|
+
self.assertEqual(query.get_sql(), exp_sql)
|
|
107
|
+
self.assertEqual(query.get_parameters(), exp_params)
|
david8-0.dev4/README.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# david8
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|