reykit 1.0.0__py3-none-any.whl → 1.0.1__py3-none-any.whl

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.
reydb/rexecute.py ADDED
@@ -0,0 +1,354 @@
1
+ # !/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @Time : 2022-12-05 14:10:02
6
+ @Author : Rey
7
+ @Contact : reyxbo@163.com
8
+ @Explain : Database execute methods.
9
+ """
10
+
11
+
12
+ from __future__ import annotations
13
+ from typing import Any, Union, Literal, overload
14
+ from reykit.rexception import throw
15
+ from reykit.rtable import Table
16
+
17
+ from .rconnection import RDatabase, RDBConnection, RResult
18
+
19
+
20
+ __all__ = (
21
+ 'RDBExecute',
22
+ )
23
+
24
+
25
+ class RDBExecute(object):
26
+ """
27
+ Rey's `database execute` type.
28
+
29
+ Examples
30
+ --------
31
+ Select.
32
+ >>> field = ['id', 'value']
33
+ >>> where = '`id` = ids'
34
+ >>> ids = (1, 2)
35
+ >>> result = RDBExecute.database.table(field, where, ids=ids)
36
+
37
+ Insert.
38
+ >>> data = [{'id': 1}, {'id': 2}]
39
+ >>> duplicate = 'ignore'
40
+ >>> result = RDBExecute.database.table + data
41
+ >>> result = RDBExecute.database.table + (data, duplicate)
42
+ >>> result = RDBExecute.database.table + {'data': data, 'duplicate': duplicate}
43
+
44
+ Update.
45
+ >>> data = [{'name': 'a', 'id': 1}, {'name': 'b', 'id': 2}]
46
+ >>> where_fields = 'id'
47
+ >>> result = RDBExecute.database.table & data
48
+ >>> result = RDBExecute.database.table & (data, where_fields)
49
+ >>> result = RDBExecute.database.table & {'data': data, 'where_fields': where_fields}
50
+
51
+ Delete.
52
+ >>> where = '`id` IN (1, 2)'
53
+ >>> report = True
54
+ >>> result = RDBExecute.database.table - where
55
+ >>> result = RDBExecute.database.table - (where, report)
56
+ >>> result = RDBExecute.database.table - {'where': where, 'report': report}
57
+
58
+ Copy.
59
+ >>> where = '`id` IN (1, 2)'
60
+ >>> limit = 1
61
+ >>> result = RDBExecute.database.table * where
62
+ >>> result = RDBExecute.database.table * (where, limit)
63
+ >>> result = RDBExecute.database.table * {'where': where, 'limit': limit}
64
+
65
+ Exist.
66
+ >>> where = '`id` IN (1, 2)'
67
+ >>> report = True
68
+ >>> result = where in RDBExecute.database.table
69
+ >>> result = (where, report) in RDBExecute.database.table
70
+ >>> result = {'where': where, 'report': report} in RDBExecute.database.table
71
+
72
+ Count.
73
+ >>> result = len(RDBExecute.database.table)
74
+
75
+ Default database.
76
+ >>> field = ['id', 'value']
77
+ >>> engine = RDatabase(**server, database)
78
+ >>> result = engine.exe.table()
79
+ """
80
+
81
+
82
+ def __init__(self, rdatabase: Union[RDatabase, RDBConnection]) -> None:
83
+ """
84
+ Build `database execute` attributes.
85
+
86
+ Parameters
87
+ ----------
88
+ rdatabase : RDatabase or RDBConnection instance.
89
+ """
90
+
91
+ # Set parameter.
92
+ self._rdatabase = rdatabase
93
+ self._path: list[str] = []
94
+
95
+
96
+ @overload
97
+ def __getattr__(self, key: Literal['_rdatabase']) -> Union[RDatabase, RDBConnection]: ...
98
+
99
+ @overload
100
+ def __getattr__(self, key: Literal['_path']) -> list[str]: ...
101
+
102
+ @overload
103
+ def __getattr__(self, key: str) -> RDBExecute: ...
104
+
105
+ def __getattr__(self, key: str) -> Union[
106
+ Union[RDatabase, RDBConnection],
107
+ list[str],
108
+ RDBExecute
109
+ ]:
110
+ """
111
+ Get attribute or set database name or set table name.
112
+
113
+ Parameters
114
+ ----------
115
+ key : Attribute key or database name or table name.
116
+
117
+ Returns
118
+ -------
119
+ Value of attribute or self.
120
+ """
121
+
122
+ # Filter private.
123
+ if key in ('_rdatabase', '_path'):
124
+ return self.__dict__[key]
125
+
126
+ # Check parameter.
127
+ if len(self._path) not in (0, 1):
128
+ throw(AssertionError)
129
+
130
+ # Set parameter.
131
+ self._path.append(key)
132
+
133
+ return self
134
+
135
+
136
+ @property
137
+ def _get_path(self) -> tuple[str, str]:
138
+ """
139
+ Get database name and table name.
140
+
141
+ Returns
142
+ -------
143
+ Database name and table name.
144
+ """
145
+
146
+ # Get.
147
+ path_len = len(self._path)
148
+ match path_len:
149
+ case 1:
150
+ database = self._rdatabase.database
151
+ table = self._path[0]
152
+ case 2:
153
+ database = self._path[0]
154
+ table = self._path[1]
155
+ case _:
156
+ throw(AssertionError)
157
+
158
+ return database, table
159
+
160
+
161
+ def __call__(
162
+ self,
163
+ *args: Any,
164
+ **kwargs: Any
165
+ ) -> RResult:
166
+ """
167
+ Select the data of table in the datebase.
168
+
169
+ Parameters
170
+ ----------
171
+ args : Position arguments.
172
+ kwargs : Keyword arguments.
173
+
174
+ Returns
175
+ -------
176
+ Result object.
177
+ """
178
+
179
+ # Selete.
180
+ result = self._rdatabase.execute_select(self._get_path, *args, **kwargs)
181
+
182
+ return result
183
+
184
+
185
+ def __add__(
186
+ self,
187
+ params: Union[tuple, dict, Table]
188
+ ) -> RResult:
189
+ """
190
+ Insert the data of table in the datebase.
191
+
192
+ Parameters
193
+ ----------
194
+ params : Insert parameters.
195
+ - `tuple`: Enter parameters in '(path, *params)' format.
196
+ - `dict`: Enter parameters in '(path, **params)' format.
197
+ - `Table`: Enter parameters in '(path, params)' format.
198
+
199
+ Returns
200
+ -------
201
+ Result object.
202
+ """
203
+
204
+ # Insert.
205
+ match params:
206
+ case tuple():
207
+ result = self._rdatabase.execute_insert(self._get_path, *params)
208
+ case dict():
209
+ result = self._rdatabase.execute_insert(self._get_path, **params)
210
+ case _:
211
+ result = self._rdatabase.execute_insert(self._get_path, params)
212
+
213
+ return result
214
+
215
+
216
+ def __and__(
217
+ self,
218
+ params: Union[tuple, dict, Table]
219
+ ) -> RResult:
220
+ """
221
+ Update the data of table in the datebase.
222
+
223
+ Parameters
224
+ ----------
225
+ params : Update parameters.
226
+ - `tuple`: Enter parameters in '(path, *params)' format.
227
+ - `dict`: Enter parameters in '(path, **params)' format.
228
+ - `Table`: Enter parameters in '(path, params)' format.
229
+
230
+ Returns
231
+ -------
232
+ Result object.
233
+ """
234
+
235
+ # Update.
236
+ match params:
237
+ case tuple():
238
+ result = self._rdatabase.execute_update(self._get_path, *params)
239
+ case dict():
240
+ result = self._rdatabase.execute_update(self._get_path, **params)
241
+ case _:
242
+ result = self._rdatabase.execute_update(self._get_path, params)
243
+
244
+ return result
245
+
246
+
247
+ def __sub__(
248
+ self,
249
+ params: Union[tuple, dict, str]
250
+ ) -> RResult:
251
+ """
252
+ Delete the data of table in the datebase.
253
+
254
+ Parameters
255
+ ----------
256
+ params : Update parameters.
257
+ - `tuple`: Enter parameters in '(path, *params)' format.
258
+ - `dict`: Enter parameters in '(path, **params)' format.
259
+ - `str`: Enter parameters in '(path, params)' format.
260
+
261
+ Returns
262
+ -------
263
+ Result object.
264
+ """
265
+
266
+ # Update.
267
+ match params:
268
+ case tuple():
269
+ result = self._rdatabase.execute_delete(self._get_path, *params)
270
+ case dict():
271
+ result = self._rdatabase.execute_delete(self._get_path, **params)
272
+ case _:
273
+ result = self._rdatabase.execute_delete(self._get_path, params)
274
+
275
+ return result
276
+
277
+
278
+ def __mul__(
279
+ self,
280
+ params: Union[tuple, dict, str]
281
+ ) -> RResult:
282
+ """
283
+ Copy record of table in the datebase.
284
+
285
+ Parameters
286
+ ----------
287
+ params : Update parameters.
288
+ - `tuple`: Enter parameters in '(path, *params)' format.
289
+ - `dict`: Enter parameters in '(path, **params)' format.
290
+ - `str`: Enter parameters in '(path, params)' format.
291
+
292
+ Returns
293
+ -------
294
+ Result object.
295
+ """
296
+
297
+ # Update.
298
+ match params:
299
+ case tuple():
300
+ result = self._rdatabase.execute_copy(self._get_path, *params)
301
+ case dict():
302
+ result = self._rdatabase.execute_copy(self._get_path, **params)
303
+ case _:
304
+ result = self._rdatabase.execute_copy(self._get_path, params)
305
+
306
+ return result
307
+
308
+
309
+ def __contains__(
310
+ self,
311
+ params: Union[tuple, dict, str]
312
+ ) -> bool:
313
+ """
314
+ Judge the exist of record.
315
+
316
+ Parameters
317
+ ----------
318
+ params : Update parameters.
319
+ - `tuple`: Enter parameters in '(path, *params)' format.
320
+ - `dict`: Enter parameters in '(path, **params)' format.
321
+ - `str`: Enter parameters in '(path, params)' format.
322
+
323
+ Returns
324
+ -------
325
+ Result object.
326
+ """
327
+
328
+ # Update.
329
+ match params:
330
+ case tuple():
331
+ result = self._rdatabase.execute_exist(self._get_path, *params)
332
+ case dict():
333
+ result = self._rdatabase.execute_exist(self._get_path, **params)
334
+ case _:
335
+ result = self._rdatabase.execute_exist(self._get_path, params)
336
+
337
+ return result
338
+
339
+
340
+ def __len__(
341
+ self
342
+ ) -> int:
343
+ """
344
+ Count records.
345
+
346
+ Returns
347
+ -------
348
+ Record count.
349
+ """
350
+
351
+ # Update.
352
+ result = self._rdatabase.execute_count(self._get_path)
353
+
354
+ return result