sqlite-database 0.6.9__tar.gz → 0.7.0__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.
- {sqlite_database-0.6.9/sqlite_database.egg-info → sqlite_database-0.7.0}/PKG-INFO +1 -1
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/__init__.py +1 -1
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/model/query_builder.py +62 -62
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/table.py +72 -72
- {sqlite_database-0.6.9 → sqlite_database-0.7.0/sqlite_database.egg-info}/PKG-INFO +1 -1
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/tests/test_database.py +4 -4
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.editorconfig +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.github/dependabot.yml +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.github/workflows/pylint.yml +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.github/workflows/pytest.yml +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.github/workflows/python-publish.yml +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.gitignore +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.readthedocs.yaml +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/.vscode/settings.json +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/Features.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/History.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/LICENSE +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/README.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/SimpleGuide.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/TODO.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/bin/activate +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/bin/check.bat +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/bin/check.sh +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/bin/include/utility.bash +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/bin/install.bash +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/bin/need-installed/activate +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/bin/need-installed/pre-commit +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/bin/summarize-pylint.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/dev-config/black.toml +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/dev-config/pylint.toml +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/dev-config/pytest.ini +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/dev-requirements.txt +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/Makefile +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/SimpleGuide.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/api_reference.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/conf.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/index.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/make.bat +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/modules.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.column.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.config.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.csv.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.database.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.errors.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.functions.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.locals.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.model.errors.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.model.helpers.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.model.query_builder.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.model.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.operators.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.query_builder.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.signature.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.subexp.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.table.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.typings.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.utils.rst +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/usage.md +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs-requirements.txt +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/project-init.bash +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/pyproject.toml +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/setup.cfg +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/setup.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/_debug.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/_utils.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/column.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/csv.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/database.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/errors.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/functions.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/locals.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/model/__init__.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/model/errors.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/model/helpers.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/model/mixin.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/operators.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/query_builder.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/signature.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/subquery.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/typings.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database/utils.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database.egg-info/SOURCES.txt +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database.egg-info/dependency_links.txt +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database.egg-info/requires.txt +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database.egg-info/top_level.txt +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database.egg-info/zip-safe +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/tests/__init__.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/tests/manual_test_performances.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/tests/test_internals.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/tests/user_benchmark.py +0 -0
- {sqlite_database-0.6.9 → sqlite_database-0.7.0}/tests/user_helpers.py +0 -0
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
"""Model QueryBuilder"""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
from typing import Any, Generic, Type, TypeVar
|
|
5
|
-
from ..column import check_one
|
|
6
|
-
from ..functions import Function
|
|
7
|
-
from .. import model as models # pylint: disable=unused-import
|
|
8
|
-
|
|
9
|
-
T = TypeVar("T", bound="models.BaseModel")
|
|
10
|
-
count = Function('COUNT')
|
|
11
|
-
|
|
12
|
-
class QueryBuilder(Generic[T]):
|
|
13
|
-
# pylint: disable=protected-access
|
|
14
|
-
"""Query builder for Model ORM"""
|
|
15
|
-
|
|
16
|
-
def __init__(self, model: Type[T]) -> None:
|
|
17
|
-
self._model = model
|
|
18
|
-
self._filters: dict[str, Any] = {}
|
|
19
|
-
self._limit = 0
|
|
20
|
-
self._offset = 0
|
|
21
|
-
self._order = None
|
|
22
|
-
|
|
23
|
-
def where(self, **kwargs):
|
|
24
|
-
"""Sets conditioning"""
|
|
25
|
-
self._filters.update(kwargs)
|
|
26
|
-
return self
|
|
27
|
-
|
|
28
|
-
def limit(self, value: int):
|
|
29
|
-
"""Sets limit"""
|
|
30
|
-
self._limit = value
|
|
31
|
-
return self
|
|
32
|
-
|
|
33
|
-
def offset(self, value: int):
|
|
34
|
-
"""Sets offset"""
|
|
35
|
-
self._offset = value
|
|
36
|
-
return self
|
|
37
|
-
|
|
38
|
-
def order_by(self, column: str, descending: bool = False):
|
|
39
|
-
"""Order the query by a column"""
|
|
40
|
-
self._order = (check_one(column), "asc" if descending is False else "desc")
|
|
41
|
-
return self
|
|
42
|
-
|
|
43
|
-
def fetch(self) -> list[T]:
|
|
44
|
-
"""Fetch data from table"""
|
|
45
|
-
return [
|
|
46
|
-
self._model(**record)
|
|
47
|
-
for record in self._model._tbl.select( # pylint: disable=protected-access
|
|
48
|
-
self._filters, limit=self._limit, offset=self._offset, order=self._order
|
|
49
|
-
)
|
|
50
|
-
]
|
|
51
|
-
|
|
52
|
-
def fetch_one(self) -> T:
|
|
53
|
-
"""Fetch one data from table"""
|
|
54
|
-
# pylint: disable=protected-access
|
|
55
|
-
record = self._model._tbl.select_one(
|
|
56
|
-
self._filters, order=self._order
|
|
57
|
-
)
|
|
58
|
-
return self._model(**record)
|
|
59
|
-
|
|
60
|
-
def count(self) -> int:
|
|
61
|
-
"""Count how much data is within this operation"""
|
|
62
|
-
return self._model._tbl.select(self._filters,
|
|
1
|
+
"""Model QueryBuilder"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import Any, Generic, Type, TypeVar
|
|
5
|
+
from ..column import check_one
|
|
6
|
+
from ..functions import Function
|
|
7
|
+
from .. import model as models # pylint: disable=unused-import
|
|
8
|
+
|
|
9
|
+
T = TypeVar("T", bound="models.BaseModel")
|
|
10
|
+
count = Function('COUNT')
|
|
11
|
+
|
|
12
|
+
class QueryBuilder(Generic[T]):
|
|
13
|
+
# pylint: disable=protected-access
|
|
14
|
+
"""Query builder for Model ORM"""
|
|
15
|
+
|
|
16
|
+
def __init__(self, model: Type[T]) -> None:
|
|
17
|
+
self._model = model
|
|
18
|
+
self._filters: dict[str, Any] = {}
|
|
19
|
+
self._limit = 0
|
|
20
|
+
self._offset = 0
|
|
21
|
+
self._order = None
|
|
22
|
+
|
|
23
|
+
def where(self, **kwargs):
|
|
24
|
+
"""Sets conditioning"""
|
|
25
|
+
self._filters.update(kwargs)
|
|
26
|
+
return self
|
|
27
|
+
|
|
28
|
+
def limit(self, value: int):
|
|
29
|
+
"""Sets limit"""
|
|
30
|
+
self._limit = value
|
|
31
|
+
return self
|
|
32
|
+
|
|
33
|
+
def offset(self, value: int):
|
|
34
|
+
"""Sets offset"""
|
|
35
|
+
self._offset = value
|
|
36
|
+
return self
|
|
37
|
+
|
|
38
|
+
def order_by(self, column: str, descending: bool = False):
|
|
39
|
+
"""Order the query by a column"""
|
|
40
|
+
self._order = (check_one(column), "asc" if descending is False else "desc")
|
|
41
|
+
return self
|
|
42
|
+
|
|
43
|
+
def fetch(self) -> list[T]:
|
|
44
|
+
"""Fetch data from table"""
|
|
45
|
+
return [
|
|
46
|
+
self._model(**record)
|
|
47
|
+
for record in self._model._tbl.select( # pylint: disable=protected-access
|
|
48
|
+
self._filters, limit=self._limit, offset=self._offset, order=self._order
|
|
49
|
+
)
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
def fetch_one(self) -> T:
|
|
53
|
+
"""Fetch one data from table"""
|
|
54
|
+
# pylint: disable=protected-access
|
|
55
|
+
record = self._model._tbl.select_one(
|
|
56
|
+
self._filters, order=self._order
|
|
57
|
+
)
|
|
58
|
+
return self._model(**record)
|
|
59
|
+
|
|
60
|
+
def count(self) -> int:
|
|
61
|
+
"""Count how much data is within this operation"""
|
|
62
|
+
return self._model._tbl.select(self._filters, what=count('*'))
|
|
@@ -193,14 +193,14 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
193
193
|
|
|
194
194
|
def delete(
|
|
195
195
|
self,
|
|
196
|
-
|
|
196
|
+
where: Condition = None,
|
|
197
197
|
limit: int = 0,
|
|
198
198
|
order: Optional[Orders] = None,
|
|
199
199
|
):
|
|
200
200
|
"""Delete row or rows
|
|
201
201
|
|
|
202
202
|
Args:
|
|
203
|
-
|
|
203
|
+
where (Condition, optional): Condition to determine deletion
|
|
204
204
|
See `Signature` class about conditional stuff. Defaults to None.
|
|
205
205
|
limit (int, optional): Limit deletion by integer. Defaults to 0.
|
|
206
206
|
order (Optional[Orders], optional): Order of deletion. Defaults to None.
|
|
@@ -208,7 +208,7 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
208
208
|
Returns:
|
|
209
209
|
int: Rows affected
|
|
210
210
|
"""
|
|
211
|
-
query, data = build_delete(self._table,
|
|
211
|
+
query, data = build_delete(self._table, where, limit, order) # type: ignore
|
|
212
212
|
self._control()
|
|
213
213
|
cursor = self._exec(query, data)
|
|
214
214
|
rcount = cursor.rowcount
|
|
@@ -218,15 +218,15 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
218
218
|
self._dirty = True
|
|
219
219
|
return rcount
|
|
220
220
|
|
|
221
|
-
def delete_one(self,
|
|
221
|
+
def delete_one(self, where: Condition = None, order: Optional[Orders] = None):
|
|
222
222
|
"""Delete a row
|
|
223
223
|
|
|
224
224
|
Args:
|
|
225
|
-
|
|
225
|
+
where (Condition, optional): Conditional to determine deletion.
|
|
226
226
|
Defaults to None.
|
|
227
227
|
order (Optional[Orders], optional): Order of deletion. Defaults to None.
|
|
228
228
|
"""
|
|
229
|
-
return self.delete(
|
|
229
|
+
return self.delete(where, 1, order)
|
|
230
230
|
|
|
231
231
|
def insert(self, data: Data):
|
|
232
232
|
"""Insert data to current table
|
|
@@ -267,7 +267,7 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
267
267
|
|
|
268
268
|
def update(
|
|
269
269
|
self,
|
|
270
|
-
|
|
270
|
+
where: Condition | None = None,
|
|
271
271
|
data: Data | None = None,
|
|
272
272
|
limit: int = 0,
|
|
273
273
|
order: Optional[Orders] = None,
|
|
@@ -276,7 +276,7 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
276
276
|
|
|
277
277
|
Args:
|
|
278
278
|
data (Data): New data to update
|
|
279
|
-
|
|
279
|
+
where (Condition, optional): Condition dictionary.
|
|
280
280
|
See `Signature` about how condition works. Defaults to None.
|
|
281
281
|
limit (int, optional): Limit updates. Defaults to 0.
|
|
282
282
|
order (Optional[Orders], optional): Order of change. Defaults to None.
|
|
@@ -287,7 +287,7 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
287
287
|
if data is None:
|
|
288
288
|
raise ValueError("data parameter must not be None")
|
|
289
289
|
query, data = build_update(
|
|
290
|
-
self._table, data,
|
|
290
|
+
self._table, data, where, limit, order
|
|
291
291
|
) # type: ignore
|
|
292
292
|
self._control()
|
|
293
293
|
cursor = self._exec(query, data)
|
|
@@ -300,75 +300,75 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
300
300
|
|
|
301
301
|
def update_one(
|
|
302
302
|
self,
|
|
303
|
-
|
|
304
|
-
|
|
303
|
+
where: Condition | None = None,
|
|
304
|
+
data: Data | None = None,
|
|
305
305
|
order: Orders | None = None,
|
|
306
306
|
) -> int:
|
|
307
307
|
"""Update 1 data only"""
|
|
308
|
-
return self.update(
|
|
308
|
+
return self.update(where, data, 1, order)
|
|
309
309
|
|
|
310
310
|
@overload
|
|
311
311
|
def select(
|
|
312
312
|
self,
|
|
313
|
-
|
|
314
|
-
|
|
313
|
+
where: Condition = None,
|
|
314
|
+
what: OnlyColumn = "*",
|
|
315
315
|
limit: int = 0,
|
|
316
316
|
offset: int = 0,
|
|
317
317
|
order: Optional[Orders] = None,
|
|
318
|
-
|
|
318
|
+
flatten: Literal[False] = False,
|
|
319
319
|
) -> Queries: # type: ignore
|
|
320
320
|
pass
|
|
321
321
|
|
|
322
322
|
@overload
|
|
323
323
|
def select(
|
|
324
324
|
self,
|
|
325
|
-
|
|
326
|
-
|
|
325
|
+
where: Condition = None,
|
|
326
|
+
what: OnlyColumn = "*",
|
|
327
327
|
limit: int = 0,
|
|
328
328
|
offset: int = 0,
|
|
329
329
|
order: Optional[Orders] = None,
|
|
330
|
-
|
|
330
|
+
flatten: Literal[True] = True,
|
|
331
331
|
) -> SquashedSqueries:
|
|
332
332
|
pass
|
|
333
333
|
|
|
334
334
|
@overload
|
|
335
335
|
def select(
|
|
336
336
|
self,
|
|
337
|
-
|
|
338
|
-
|
|
337
|
+
where: Condition = None,
|
|
338
|
+
what: ParsedFn = _null,
|
|
339
339
|
limit: int = 0,
|
|
340
340
|
offset: int = 0,
|
|
341
341
|
order: Optional[Orders] = None,
|
|
342
|
-
|
|
342
|
+
flatten: Literal[False] = False,
|
|
343
343
|
) -> Any:
|
|
344
344
|
pass
|
|
345
345
|
|
|
346
346
|
@overload
|
|
347
347
|
def select(
|
|
348
348
|
self,
|
|
349
|
-
|
|
350
|
-
|
|
349
|
+
where: Condition = None,
|
|
350
|
+
what: JustAColumn = "_COLUMN",
|
|
351
351
|
limit: int = 0,
|
|
352
352
|
offset: int = 0,
|
|
353
353
|
order: Optional[Orders] = None,
|
|
354
|
-
|
|
354
|
+
flatten: Literal[False] = False,
|
|
355
355
|
) -> list[Any]:
|
|
356
356
|
pass
|
|
357
357
|
|
|
358
358
|
def select(
|
|
359
359
|
self, # pylint: disable=too-many-arguments
|
|
360
|
-
|
|
361
|
-
|
|
360
|
+
where: Condition = None,
|
|
361
|
+
what: OnlyColumn | ParsedFn | JustAColumn = "*",
|
|
362
362
|
limit: int = 0,
|
|
363
363
|
offset: int = 0,
|
|
364
364
|
order: Optional[Orders] = None,
|
|
365
|
-
|
|
365
|
+
flatten: bool = False,
|
|
366
366
|
):
|
|
367
367
|
"""Select data in current table. Bare .select() returns all data.
|
|
368
368
|
|
|
369
369
|
Args:
|
|
370
|
-
|
|
371
|
-
|
|
370
|
+
where (Condition, optional): Conditions to used. Defaults to None.
|
|
371
|
+
what: (OnlyColumn, ParsedFn, optional): Select what you want. Default to None.
|
|
372
372
|
limit (int, optional): Limit of select. Defaults to 0.
|
|
373
373
|
offset (int, optional): Offset. Defaults to 0
|
|
374
374
|
order (Optional[Orders], optional): Selection order. Defaults to None.
|
|
@@ -380,72 +380,72 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
380
380
|
self._control()
|
|
381
381
|
self._query_control()
|
|
382
382
|
query, data = build_select(
|
|
383
|
-
self._table,
|
|
383
|
+
self._table, where, what, limit, offset, order
|
|
384
384
|
) # type: ignore
|
|
385
|
-
just_a_column = (isinstance(
|
|
386
|
-
isinstance(
|
|
385
|
+
just_a_column = (isinstance(what, tuple) and len(what) == 1) or (
|
|
386
|
+
isinstance(what, str) and what != "*"
|
|
387
387
|
)
|
|
388
388
|
with self._sql:
|
|
389
389
|
cursor = self._exec(query, data)
|
|
390
390
|
data = cursor.fetchall()
|
|
391
391
|
if just_a_column:
|
|
392
|
-
return [d[
|
|
393
|
-
if
|
|
392
|
+
return [d[what] for d in data]
|
|
393
|
+
if flatten:
|
|
394
394
|
return crunch(data)
|
|
395
|
-
if isinstance(
|
|
396
|
-
return data[0][
|
|
395
|
+
if isinstance(what, ParsedFn):
|
|
396
|
+
return data[0][what.parse_sql()[0]]
|
|
397
397
|
return data
|
|
398
398
|
|
|
399
399
|
@overload
|
|
400
400
|
def paginate_select(
|
|
401
401
|
self,
|
|
402
|
-
|
|
403
|
-
|
|
402
|
+
where: Condition = None,
|
|
403
|
+
what: OnlyColumn = "*",
|
|
404
404
|
page: int = 0,
|
|
405
405
|
length: int = 10,
|
|
406
406
|
order: Optional[Orders] = None,
|
|
407
|
-
|
|
407
|
+
flatten: Literal[False] = False,
|
|
408
408
|
) -> Generator[Queries, None, None]: # type: ignore
|
|
409
409
|
pass
|
|
410
410
|
|
|
411
411
|
@overload
|
|
412
412
|
def paginate_select(
|
|
413
413
|
self,
|
|
414
|
-
|
|
415
|
-
|
|
414
|
+
where: Condition = None,
|
|
415
|
+
what: JustAColumn = "_COLUMN",
|
|
416
416
|
page: int = 0,
|
|
417
417
|
length: int = 10,
|
|
418
418
|
order: Optional[Orders] = None,
|
|
419
|
-
|
|
419
|
+
flatten: Literal[False] = False,
|
|
420
420
|
) -> Generator[list[Any], None, None]: # type: ignore
|
|
421
421
|
pass
|
|
422
422
|
|
|
423
423
|
@overload
|
|
424
424
|
def paginate_select(
|
|
425
425
|
self,
|
|
426
|
-
|
|
427
|
-
|
|
426
|
+
where: Condition = None,
|
|
427
|
+
what: OnlyColumn = "*",
|
|
428
428
|
page: int = 0,
|
|
429
429
|
length: int = 10,
|
|
430
430
|
order: Optional[Orders] = None,
|
|
431
|
-
|
|
431
|
+
flatten: Literal[True] = True,
|
|
432
432
|
) -> Generator[SquashedSqueries, None, None]:
|
|
433
433
|
pass
|
|
434
434
|
|
|
435
435
|
def paginate_select(
|
|
436
436
|
self,
|
|
437
|
-
|
|
438
|
-
|
|
437
|
+
where: Condition = None,
|
|
438
|
+
what: OnlyColumn | JustAColumn = "*",
|
|
439
439
|
page: int = 0,
|
|
440
440
|
length: int = 10,
|
|
441
441
|
order: Optional[Orders] = None,
|
|
442
|
-
|
|
442
|
+
flatten: bool = False,
|
|
443
443
|
):
|
|
444
444
|
"""Paginate select
|
|
445
445
|
|
|
446
446
|
Args:
|
|
447
|
-
|
|
448
|
-
|
|
447
|
+
where (Condition, optional): Confitions to use. Defaults to None.
|
|
448
|
+
what (OnlyColumn, optional): Select what you want. Default to None.
|
|
449
449
|
page (int): Which page number be returned first
|
|
450
450
|
length (int, optional): Pagination length. Defaults to 10.
|
|
451
451
|
order (Optional[Orders], optional): Order. Defaults to None.
|
|
@@ -462,19 +462,19 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
462
462
|
start = page * length
|
|
463
463
|
# ! A `only` keyword as a string or tuple of 1 element will
|
|
464
464
|
# ! actually be a problem if they left alone because the end result is a list
|
|
465
|
-
just_a_column = (isinstance(
|
|
466
|
-
isinstance(
|
|
465
|
+
just_a_column = (isinstance(what, str) and what != "*") or (
|
|
466
|
+
isinstance(what, tuple) and len(what) == 1
|
|
467
467
|
)
|
|
468
468
|
while True:
|
|
469
469
|
query, data = build_select(
|
|
470
|
-
self._table,
|
|
470
|
+
self._table, where, what, length, start, order
|
|
471
471
|
) # type: ignore
|
|
472
472
|
with self._sql:
|
|
473
473
|
cursor = self._exec(query, data)
|
|
474
474
|
fetched = cursor.fetchmany(length)
|
|
475
475
|
if len(fetched) == 0:
|
|
476
476
|
return
|
|
477
|
-
if
|
|
477
|
+
if flatten and not just_a_column:
|
|
478
478
|
fetched = crunch(fetched)
|
|
479
479
|
if len(fetched) != length:
|
|
480
480
|
yield fetched
|
|
@@ -485,8 +485,8 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
485
485
|
@overload
|
|
486
486
|
def select_one(
|
|
487
487
|
self,
|
|
488
|
-
|
|
489
|
-
|
|
488
|
+
where: Condition = None,
|
|
489
|
+
what: ParsedFn = _null,
|
|
490
490
|
order: Optional[Orders] = None,
|
|
491
491
|
) -> Any:
|
|
492
492
|
pass
|
|
@@ -494,8 +494,8 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
494
494
|
@overload
|
|
495
495
|
def select_one(
|
|
496
496
|
self,
|
|
497
|
-
|
|
498
|
-
|
|
497
|
+
where: Condition = None,
|
|
498
|
+
what: OnlyColumn = "*",
|
|
499
499
|
order: Optional[Orders] = None,
|
|
500
500
|
) -> Query:
|
|
501
501
|
pass
|
|
@@ -503,23 +503,23 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
503
503
|
@overload
|
|
504
504
|
def select_one(
|
|
505
505
|
self,
|
|
506
|
-
|
|
507
|
-
|
|
506
|
+
where: Condition = None,
|
|
507
|
+
what: JustAColumn = "_COLUMN",
|
|
508
508
|
order: Optional[Orders] = None,
|
|
509
509
|
) -> Any:
|
|
510
510
|
pass
|
|
511
511
|
|
|
512
512
|
def select_one(
|
|
513
513
|
self,
|
|
514
|
-
|
|
515
|
-
|
|
514
|
+
where: Condition = None,
|
|
515
|
+
what: OnlyColumn | JustAColumn | ParsedFn = "*",
|
|
516
516
|
order: Optional[Orders] = None,
|
|
517
517
|
):
|
|
518
518
|
"""Select one data
|
|
519
519
|
|
|
520
520
|
Args:
|
|
521
|
-
|
|
522
|
-
|
|
521
|
+
where (Condition, optional): Condition to use. Defaults to None.
|
|
522
|
+
what: (OnlyColumn, optional): Select what you want. Default to None.
|
|
523
523
|
order (Optional[Orders], optional): Order of selection. Defaults to None.
|
|
524
524
|
|
|
525
525
|
Returns:
|
|
@@ -528,19 +528,19 @@ class Table: # pylint: disable=too-many-instance-attributes
|
|
|
528
528
|
self._control()
|
|
529
529
|
self._query_control()
|
|
530
530
|
query, data = build_select(
|
|
531
|
-
self._table,
|
|
531
|
+
self._table, where, what, 1, 0, order
|
|
532
532
|
) # type: ignore
|
|
533
533
|
with self._sql:
|
|
534
534
|
cursor = self._exec(query, data)
|
|
535
535
|
data = cursor.fetchone()
|
|
536
|
-
if isinstance(
|
|
537
|
-
return data[
|
|
536
|
+
if isinstance(what, ParsedFn):
|
|
537
|
+
return data[what.parse_sql()[0]]
|
|
538
538
|
if not data:
|
|
539
539
|
return Row()
|
|
540
|
-
if isinstance(
|
|
541
|
-
return data[
|
|
542
|
-
if isinstance(
|
|
543
|
-
return data[
|
|
540
|
+
if isinstance(what, tuple) and len(what) == 1:
|
|
541
|
+
return data[what]
|
|
542
|
+
if isinstance(what, str) and what != "*":
|
|
543
|
+
return data[what]
|
|
544
544
|
return data
|
|
545
545
|
|
|
546
546
|
def columns(self):
|
|
@@ -595,7 +595,7 @@ constraint is enabled."
|
|
|
595
595
|
def count(self):
|
|
596
596
|
"""Count how much objects/rows stored in this table"""
|
|
597
597
|
# ? Might as well uses __len__? But it's quite expensive.
|
|
598
|
-
return self.select(
|
|
598
|
+
return self.select(what=count("*"))
|
|
599
599
|
|
|
600
600
|
def __repr__(self) -> str:
|
|
601
601
|
return f"<Table({self._table}) -> {self._parent_repr}>"
|
|
@@ -206,7 +206,7 @@ def test_00_04_select_crunch():
|
|
|
206
206
|
database = Database(":memory:")
|
|
207
207
|
setup_database(database)
|
|
208
208
|
groups = database.table("groups")
|
|
209
|
-
assert groups.select(
|
|
209
|
+
assert groups.select(flatten=True) == GROUP_BASE_CRUNCHED
|
|
210
210
|
|
|
211
211
|
|
|
212
212
|
def test_00_05_select_one_only_one_item():
|
|
@@ -222,8 +222,8 @@ def test_00_06_select_order_by():
|
|
|
222
222
|
database = Database(":memory:")
|
|
223
223
|
setup_orderable(database)
|
|
224
224
|
items = database.table("items")
|
|
225
|
-
first_high = items.select(
|
|
226
|
-
first_low = items.select(
|
|
225
|
+
first_high = items.select(what="quantity", limit=3, order=("quantity", "asc"))
|
|
226
|
+
first_low = items.select(what="quantity", limit=3, order=("quantity", "desc"))
|
|
227
227
|
assert first_high == [0, 1, 2]
|
|
228
228
|
assert first_low == [99, 98, 97]
|
|
229
229
|
|
|
@@ -404,7 +404,7 @@ def test_08_00_function_count():
|
|
|
404
404
|
database = Database(":memory:")
|
|
405
405
|
setup_database_fns(database)
|
|
406
406
|
counted = count("*")
|
|
407
|
-
data = database.table("checkout").select(
|
|
407
|
+
data = database.table("checkout").select(what=counted)
|
|
408
408
|
print(data)
|
|
409
409
|
assert data == 4
|
|
410
410
|
|
|
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
|
|
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
|
{sqlite_database-0.6.9 → sqlite_database-0.7.0}/docs/sqlite_database.model.query_builder.rst
RENAMED
|
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
|
|
File without changes
|
{sqlite_database-0.6.9 → sqlite_database-0.7.0}/sqlite_database.egg-info/dependency_links.txt
RENAMED
|
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
|