reydb 1.2.5__py3-none-any.whl → 1.2.7__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/rconfig.py CHANGED
@@ -44,12 +44,12 @@ class DatabaseTableConfig(rorm.Model, table=True):
44
44
  """
45
45
 
46
46
  __comment__ = 'Config data table.'
47
- create_time: rorm.Datetime = rorm.Field(field_default='CURRENT_TIMESTAMP', not_null=True, index_n=True, comment='Config create time.')
48
- update_time: rorm.Datetime = rorm.Field(field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config update time.')
49
- key: str = rorm.Field(field_type=rorm.types.VARCHAR(50), key=True, comment='Config key.')
50
- value: str = rorm.Field(field_type=rorm.types.TEXT, not_null=True, comment='Config value.')
51
- type: str = rorm.Field(field_type=rorm.types.VARCHAR(50), not_null=True, comment='Config value type.')
52
- note: str = rorm.Field(field_type=rorm.types.VARCHAR(500), comment='Config note.')
47
+ create_time: rorm.Datetime = rorm.Field(field_default=':create_time', not_null=True, index_n=True, comment='Config create time.')
48
+ update_time: rorm.Datetime = rorm.Field(field_default=':update_time', index_n=True, comment='Config update time.')
49
+ key: str = rorm.Field(rorm.types.VARCHAR(50), key=True, comment='Config key.')
50
+ value: str = rorm.Field(rorm.types.TEXT, not_null=True, comment='Config value.')
51
+ type: str = rorm.Field(rorm.types.VARCHAR(50), not_null=True, comment='Config value type.')
52
+ note: str = rorm.Field(rorm.types.VARCHAR(500), comment='Config note.')
53
53
 
54
54
 
55
55
  class DatabaseConfigSuper(DatabaseBase, Generic[DatabaseT]):
reydb/rerror.py CHANGED
@@ -38,12 +38,12 @@ class DatabaseTableError(rorm.Model, table=True):
38
38
  """
39
39
 
40
40
  __comment__ = 'Error log table.'
41
- create_time: rorm.Datetime = rorm.Field(field_default='CURRENT_TIMESTAMP', not_null=True, index_n=True, comment='Record create time.')
42
- id: int = rorm.Field(field_type=rorm.types_mysql.INTEGER(unsigned=True), key_auto=True, comment='ID.')
43
- type: str = rorm.Field(field_type=rorm.types.VARCHAR(50), not_null=True, index_n=True, comment='Error type.')
44
- data: str = rorm.Field(field_type=rorm.types.JSON, comment='Error data.')
45
- stack: str = rorm.Field(field_type=rorm.types.JSON, comment='Error code traceback stack.')
46
- note: str = rorm.Field(field_type=rorm.types.VARCHAR(500), comment='Error note.')
41
+ create_time: rorm.Datetime = rorm.Field(field_default=':create_time', not_null=True, index_n=True, comment='Record create time.')
42
+ id: int = rorm.Field(rorm.types_mysql.INTEGER(unsigned=True), key_auto=True, comment='ID.')
43
+ type: str = rorm.Field(rorm.types.VARCHAR(50), not_null=True, index_n=True, comment='Error type.')
44
+ data: str = rorm.Field(rorm.types.JSON, comment='Error data.')
45
+ stack: str = rorm.Field(rorm.types.JSON, comment='Error code traceback stack.')
46
+ note: str = rorm.Field(rorm.types.VARCHAR(500), comment='Error note.')
47
47
 
48
48
 
49
49
  class DatabaseErrorSuper(DatabaseBase, Generic[DatabaseT]):
reydb/rorm.py CHANGED
@@ -21,12 +21,13 @@ from sqlalchemy import types
21
21
  from sqlalchemy.dialects.mysql import types as types_mysql
22
22
  from sqlalchemy.sql.sqltypes import TypeEngine
23
23
  from sqlalchemy.sql.dml import Insert, Update, Delete
24
+ from sqlalchemy.sql import func as sqlalchemy_func
24
25
  from sqlmodel import SQLModel, Session, Table
25
26
  from sqlmodel.ext.asyncio.session import AsyncSession
26
27
  from sqlmodel.main import SQLModelMetaclass, FieldInfo, default_registry
27
28
  from sqlmodel.sql._expression_select_cls import SelectOfScalar as Select
28
29
  from datetime import datetime, date, time, timedelta
29
- from reykit.rbase import CallableT, Null, throw, is_instance
30
+ from reykit.rbase import CallableT, throw, is_instance
30
31
 
31
32
  from . import rdb
32
33
  from .rbase import (
@@ -122,14 +123,18 @@ class DatabaseORMModelMeta(DatabaseORMBase, SQLModelMetaclass):
122
123
  table_args['comment'] = attrs.pop('__comment__')
123
124
 
124
125
  ## Field.
125
- for __name__ in attrs['__annotations__']:
126
- field = attrs.get(__name__)
127
- if field is None:
128
- field = attrs[__name__] = DatabaseORMModelField()
126
+ for attr_name in attrs['__annotations__']:
127
+ attr_name: str
128
+ if attr_name in attrs:
129
+ field = attrs[attr_name]
130
+ if type(field) != DatabaseORMModelField:
131
+ field = attrs[attr_name] = DatabaseORMModelField(field)
132
+ else:
133
+ field = attrs[attr_name] = DatabaseORMModelField()
129
134
  sa_column_kwargs: dict = field.sa_column_kwargs
130
- sa_column_kwargs.setdefault('name', __name__)
135
+ sa_column_kwargs.setdefault('name', attr_name)
131
136
 
132
- ## Unique.
137
+ ## Replace.
133
138
  table = default_registry.metadata.tables.get(table_name)
134
139
  if table is not None:
135
140
  default_registry.metadata.remove(table)
@@ -155,7 +160,10 @@ class DatabaseORMModelMeta(DatabaseORMBase, SQLModelMetaclass):
155
160
  super().__init__(name, bases, attrs, **kwargs)
156
161
 
157
162
  # Set parameter.
158
- if '__annotations__' in attrs:
163
+ if (
164
+ '__annotations__' in attrs
165
+ and hasattr(cls, '__table__')
166
+ ):
159
167
  table: Table = cls.__table__
160
168
  for index in table.indexes:
161
169
  index_name_prefix = ['u_', 'n_'][index.unique]
@@ -180,12 +188,12 @@ class DatabaseORMModelField(DatabaseORMBase, FieldInfo):
180
188
  @overload
181
189
  def __init__(
182
190
  self,
183
- arg_default: Any | Callable[[], Any] | Null = Null,
184
- *,
185
- arg_name: str | None = None,
186
- field_default: str | Literal['CURRENT_TIMESTAMP'] | Literal['ON UPDATE CURRENT_TIMESTAMP'] | None = None,
187
- filed_name: str | None = None,
188
191
  field_type: TypeEngine | None = None,
192
+ *,
193
+ field_default: str | Literal[':time'] | Literal[':create_time'] | Literal[':update_time'] = None,
194
+ arg_default: Any | Callable[[], Any] | None = None,
195
+ arg_update: Any | Callable[[], Any] = None,
196
+ name: str | None = None,
189
197
  key: bool = False,
190
198
  key_auto: bool = False,
191
199
  not_null: bool = False,
@@ -208,7 +216,7 @@ class DatabaseORMModelField(DatabaseORMBase, FieldInfo):
208
216
 
209
217
  def __init__(
210
218
  self,
211
- arg_default: Any | Callable[[], Any] | Null = Null,
219
+ field_type: TypeEngine | None = None,
212
220
  **kwargs: Any
213
221
  ) -> None:
214
222
  """
@@ -216,19 +224,22 @@ class DatabaseORMModelField(DatabaseORMBase, FieldInfo):
216
224
 
217
225
  Parameters
218
226
  ----------
219
- arg_default : Call argument default value.
220
- arg_name : Call argument name.
221
- - `None`: Same as attribute name.
222
- field_default : Database field defualt value.
223
- - `Literal['current_timestamp']`: Set SQL syntax 'current_timestamp', case insensitive.
224
- - `Literal['on update current_timestamp']`: Set SQL syntax 'on update current_timestamp', case insensitive.
225
- field_name : Database field name.
226
- - `None`: Same as attribute name.
227
227
  field_type : Database field type.
228
228
  - `None`: Based type annotation automatic judgment.
229
+ field_default : Database field defualt value.
230
+ - `Literal[':time']`: Set SQL syntax 'DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'.
231
+ - `Literal[':create_time']`: Set SQL syntax 'DEFAULT CURRENT_TIMESTAMP'.
232
+ - `Literal[':update_time']`: Set SQL syntax 'ON UPDATE CURRENT_TIMESTAMP'.
233
+ arg_default : Call argument default value.
234
+ - `Callable[[], Any]`: Call function and use return value.
235
+ arg_update : In `Session` management, When commit update record, then default value is this value.
236
+ - `Callable[[], Any]`: Call function and use return value.
237
+ name : Call argument name and database field name.
238
+ - `None`: Same as attribute name.
229
239
  key : Whether the field is primary key.
230
- key_auto : Whether the field is automatic increment primary key.
240
+ key_auto : Whether the field is primary key and automatic increment.
231
241
  not_null : Whether the field is not null constraint.
242
+ - `Litreal[False]`: When argument `arg_default` is `Null`, then set argument `arg_default` is `None`.
232
243
  index_n : Whether the field add normal index.
233
244
  index_u : Whether the field add unique index.
234
245
  comment : Field commment.
@@ -257,7 +268,6 @@ class DatabaseORMModelField(DatabaseORMBase, FieldInfo):
257
268
 
258
269
  ## Convert argument name.
259
270
  mapping_keys = {
260
- 'arg_name': 'alias',
261
271
  'key': 'primary_key',
262
272
  'index_n': 'index',
263
273
  'index_u': 'unique',
@@ -272,7 +282,6 @@ class DatabaseORMModelField(DatabaseORMBase, FieldInfo):
272
282
  'num_places': 'max_digits',
273
283
  'num_places_dec': 'decimal_places'
274
284
  }
275
-
276
285
  for key_old, key_new in mapping_keys.items():
277
286
  if type(key_new) != tuple:
278
287
  key_new = (key_new,)
@@ -281,30 +290,13 @@ class DatabaseORMModelField(DatabaseORMBase, FieldInfo):
281
290
  for key in key_new:
282
291
  kwargs[key] = value
283
292
 
284
- ## Argument default.
285
- if (
286
- arg_default != Null
287
- and callable(arg_default)
288
- ):
289
- kwargs['default_factory'] = arg_default
290
- else:
291
- kwargs['default'] = arg_default
292
-
293
- ## Field default.
294
- if 'field_default' in kwargs:
295
- field_default: str = kwargs.pop('field_default')
296
- field_default_upper = field_default.upper()
297
- if field_default_upper in ('CURRENT_TIMESTAMP', 'ON UPDATE CURRENT_TIMESTAMP'):
298
- field_default = sqlalchemy_text(field_default_upper)
299
- kwargs['sa_column_kwargs']['server_default'] = field_default
300
-
301
- ## Field name.
302
- if 'field_name' in kwargs:
303
- kwargs['sa_column_kwargs']['name'] = kwargs.pop('field_name')
304
-
305
293
  ## Field type.
306
- if 'field_type' in kwargs:
307
- kwargs['sa_type'] = kwargs.pop('field_type')
294
+ if field_type is not None:
295
+ kwargs['sa_type'] = field_type
296
+
297
+ ## Name.
298
+ if 'name' in kwargs:
299
+ kwargs['alias'] = kwargs['sa_column_kwargs']['name'] = kwargs.pop('field_name')
308
300
 
309
301
  ## Key auto.
310
302
  if kwargs.get('key_auto'):
@@ -313,12 +305,45 @@ class DatabaseORMModelField(DatabaseORMBase, FieldInfo):
313
305
  else:
314
306
  kwargs['sa_column_kwargs']['autoincrement'] = False
315
307
 
308
+ ## Key.
309
+ if kwargs.get('primary_key'):
310
+ kwargs['nullable'] = False
311
+
316
312
  ## Non null.
317
313
  if 'not_null' in kwargs:
318
314
  kwargs['nullable'] = not kwargs.pop('not_null')
319
315
  else:
320
316
  kwargs['nullable'] = True
321
317
 
318
+ ## Field default.
319
+ if 'field_default' in kwargs:
320
+ field_default: str = kwargs.pop('field_default')
321
+ if field_default == ':time':
322
+ field_default = sqlalchemy_text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')
323
+ if field_default == ':create_time':
324
+ field_default = sqlalchemy_text('CURRENT_TIMESTAMP')
325
+ elif field_default == ':update_time':
326
+ if kwargs['nullable']:
327
+ field_default = sqlalchemy_text('NULL ON UPDATE CURRENT_TIMESTAMP')
328
+ else:
329
+ field_default = sqlalchemy_text('NOT NULL ON UPDATE CURRENT_TIMESTAMP')
330
+ kwargs['sa_column_kwargs']['server_default'] = field_default
331
+
332
+ ## Argument default.
333
+ arg_default = kwargs.pop('arg_default', None)
334
+ if arg_default is not None:
335
+ if callable(arg_default):
336
+ kwargs['default_factory'] = arg_default
337
+ else:
338
+ kwargs['default'] = arg_default
339
+ elif kwargs['nullable']:
340
+ kwargs['default'] = None
341
+
342
+ ## Argument update.
343
+ if 'arg_update' in kwargs:
344
+ arg_update = kwargs.pop('arg_update')
345
+ kwargs['sa_column_kwargs']['onupdate'] = arg_update
346
+
322
347
  ## Comment.
323
348
  if 'comment' in kwargs:
324
349
  kwargs['sa_column_kwargs']['comment'] = kwargs.pop('comment')
@@ -1646,6 +1671,9 @@ types = types
1646
1671
  ## Database ORM model MySQL filed types.
1647
1672
  types_mysql = types_mysql
1648
1673
 
1674
+ ## Database ORM model functions.
1675
+ funcs = sqlalchemy_func
1676
+
1649
1677
  ## Create decorator of validate database ORM model.
1650
1678
  wrap_validate_model = pydantic_model_validator
1651
1679
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reydb
3
- Version: 1.2.5
3
+ Version: 1.2.7
4
4
  Summary: Database method set.
5
5
  Project-URL: homepage, https://github.com/reyxbo/reydb/
6
6
  Author-email: Rey <reyxbo@163.com>
@@ -2,14 +2,14 @@ reydb/__init__.py,sha256=4mnlkfJfkBfxBpCotVUJ86f4AnT8plqlFbGiH3vZ4PM,550
2
2
  reydb/rall.py,sha256=IxSPGh77xz7ndDC7J8kZ_66Gq_xTAztGtnELUku1Ouw,364
3
3
  reydb/rbase.py,sha256=vx37yV6LlWP89nWAfYyOf0Xm3N_e9eB8z5Mxe-aTEo4,8248
4
4
  reydb/rbuild.py,sha256=imakdlqQXzQlbAukti3_REVU_h7IRRE3fwUk91LaIIM,80430
5
- reydb/rconfig.py,sha256=D5YxVtFqVQmlTZ8ChqcNCz8qQJn4uievB-99Vk1QLko,19197
5
+ reydb/rconfig.py,sha256=B_lwfmMg4V4C_SmuLZi8dqGhb3El3ahxouj1snhS_Ek,19143
6
6
  reydb/rconn.py,sha256=guRaR8N6RuzZzujwaeq7HhKWTizF9SrUBqEAFjfjpoo,6909
7
7
  reydb/rdb.py,sha256=syyqZbEu92NbCj9O6_T6iAv7E46CyfQOC4T8qtPfHNs,14364
8
- reydb/rerror.py,sha256=Cmbcz5CgpI2ro7CbFHUYWP6zuiFJoxy_ENzSUNuuwe8,14924
8
+ reydb/rerror.py,sha256=Hqb2CA6sG7yEPDt3UHzqrgdt63BqoWbCzji3mKBIlp0,14864
9
9
  reydb/rexec.py,sha256=djHx311c6mr1IjzNLqnGe-4yr3qNmYGUy4pHQA3WElQ,53042
10
10
  reydb/rinfo.py,sha256=LjrqTA7JJbWJsjXwV-zKpbE1htv-whg6239hoQj4yIU,18151
11
- reydb/rorm.py,sha256=baHqpNqnBaE1qQpsc5TaegJBbOhWnl748rPPzO7Ab6Q,42314
12
- reydb-1.2.5.dist-info/METADATA,sha256=GZ1M-fFt8RAr7iuFWoczq2sonIH774TfFzxLfnoPyIM,1621
13
- reydb-1.2.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
14
- reydb-1.2.5.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
15
- reydb-1.2.5.dist-info/RECORD,,
11
+ reydb/rorm.py,sha256=hwQlD1Dn4cxn1Kp5H-M85XfNMl4blohDOGrnDjLMr6A,43734
12
+ reydb-1.2.7.dist-info/METADATA,sha256=T6s0-oO-8_d59qE4tw-LKEYQsLmWMCaHlMDUEFrYhsg,1621
13
+ reydb-1.2.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
14
+ reydb-1.2.7.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
15
+ reydb-1.2.7.dist-info/RECORD,,
File without changes