database-wrapper 0.2.9__py3-none-any.whl → 0.2.13__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.
@@ -3,7 +3,7 @@ from typing import Any
3
3
  CONFIG: dict[str, Any] = {
4
4
  # These are supposed to be set automatically by a git pre-compile script
5
5
  # They are one git commit hash behind, if used automatically
6
- "git_commit_hash": "aba940d794c0b9d2390f87bd32a86c13769311d7",
7
- "git_commit_date": "10.10.2025 01:49",
8
- "app_version": "0.2.9",
6
+ "git_commit_hash": "450d82cbaaf0997ef1aba44a809ce8358e3b1ccd",
7
+ "git_commit_date": "06.01.2026 04:31",
8
+ "app_version": "0.2.13",
9
9
  }
@@ -91,23 +91,23 @@ class DBDataModel:
91
91
  # Id should be readonly by default and should be always present if record exists
92
92
  id: int = field(
93
93
  default=0,
94
- metadata={
95
- "db_field": ("id", "bigint"),
96
- "store": False,
97
- "update": False,
98
- },
94
+ metadata=MetadataDict(
95
+ db_field=("id", "bigint"),
96
+ store=False,
97
+ update=False,
98
+ ),
99
99
  )
100
100
  """id is readonly by default"""
101
101
 
102
102
  # Raw data
103
103
  raw_data: dict[str, Any] = field(
104
104
  default_factory=dict,
105
- metadata={
106
- "db_field": ("raw_data", "jsonb"),
107
- "exclude": True,
108
- "store": False,
109
- "update": False,
110
- },
105
+ metadata=MetadataDict(
106
+ db_field=("raw_data", "jsonb"),
107
+ exclude=True,
108
+ store=False,
109
+ update=False,
110
+ ),
111
111
  )
112
112
  """This is for storing temporary raw data"""
113
113
 
@@ -366,63 +366,140 @@ class DBDefaultsDataModel(DBDataModel):
366
366
  ### Default fields ###
367
367
  ######################
368
368
 
369
+ #
369
370
  created_at: datetime.datetime = field(
370
371
  default_factory=datetime.datetime.now,
371
- metadata={
372
- "db_field": ("created_at", "timestamptz"),
373
- "store": True,
374
- "update": False,
375
- "serialize": SerializeType.DATETIME,
376
- },
372
+ metadata=MetadataDict(
373
+ db_field=("created_at", "timestamptz"),
374
+ store=True,
375
+ update=False,
376
+ serialize=SerializeType.DATETIME,
377
+ ),
377
378
  )
378
379
  """created_at is readonly by default and should be present in all tables"""
379
380
 
381
+ #
380
382
  updated_at: datetime.datetime = field(
381
383
  default_factory=datetime.datetime.now,
382
- metadata={
383
- "db_field": ("updated_at", "timestamptz"),
384
- "store": True,
385
- "update": True,
386
- "serialize": SerializeType.DATETIME,
387
- },
384
+ metadata=MetadataDict(
385
+ db_field=("updated_at", "timestamptz"),
386
+ store=True,
387
+ update=True,
388
+ serialize=SerializeType.DATETIME,
389
+ ),
388
390
  )
389
391
  """updated_at should be present in all tables and is updated automatically"""
390
392
 
393
+ # full
391
394
  disabled_at: datetime.datetime = field(
392
395
  default_factory=datetime.datetime.now,
393
- metadata={
394
- "db_field": ("disabled_at", "timestamptz"),
395
- "store": False,
396
- "update": False,
397
- "serialize": SerializeType.DATETIME,
398
- },
396
+ metadata=MetadataDict(
397
+ db_field=("disabled_at", "timestamptz"),
398
+ store=False,
399
+ update=False,
400
+ serialize=SerializeType.DATETIME,
401
+ ),
399
402
  )
400
403
 
404
+ #
401
405
  deleted_at: datetime.datetime = field(
402
406
  default_factory=datetime.datetime.now,
403
- metadata={
404
- "db_field": ("deleted_at", "timestamptz"),
405
- "store": False,
406
- "update": False,
407
- "serialize": SerializeType.DATETIME,
408
- },
407
+ metadata=MetadataDict(
408
+ db_field=("deleted_at", "timestamptz"),
409
+ store=False,
410
+ update=False,
411
+ serialize=SerializeType.DATETIME,
412
+ ),
409
413
  )
410
414
 
411
415
  enabled: bool = field(
412
416
  default=True,
413
- metadata={
414
- "db_field": ("enabled", "boolean"),
415
- "store": False,
416
- "update": False,
417
- },
417
+ metadata=MetadataDict(
418
+ db_field=("enabled", "boolean"),
419
+ store=False,
420
+ update=False,
421
+ ),
418
422
  )
419
423
  deleted: bool = field(
420
424
  default=False,
421
- metadata={
422
- "db_field": ("deleted", "boolean"),
423
- "store": False,
424
- "update": False,
425
- },
425
+ metadata=MetadataDict(
426
+ db_field=("deleted", "boolean"),
427
+ store=False,
428
+ update=False,
429
+ ),
430
+ )
431
+
432
+ def update_data(self) -> dict[str, Any] | None:
433
+ """
434
+ Update data to database
435
+ """
436
+
437
+ # Update updated_at
438
+ self.updated_at = datetime.datetime.now(datetime.UTC)
439
+
440
+ return super().update_data()
441
+
442
+
443
+ @dataclass
444
+ class DBDefaultsDataModelV2(DBDataModel):
445
+ """
446
+ This class includes default fields for all database models.
447
+
448
+ Attributes:
449
+ - created_at (datetime.datetime): The timestamp of when the instance was created.
450
+ - updated_at (datetime.datetime): The timestamp of when the instance was last updated.
451
+ - enabled (bool): Whether the instance is enabled or not.
452
+ - deleted (bool): Whether the instance is deleted or not.
453
+ """
454
+
455
+ ######################
456
+ ### Default fields ###
457
+ ######################
458
+
459
+ #
460
+ created_at: datetime.datetime = field(
461
+ default_factory=datetime.datetime.now,
462
+ metadata=MetadataDict(
463
+ db_field=("created_at", "timestamptz"),
464
+ store=True,
465
+ update=False,
466
+ serialize=SerializeType.DATETIME,
467
+ ),
468
+ )
469
+ """created_at is readonly by default and should be present in all tables"""
470
+
471
+ #
472
+ updated_at: datetime.datetime = field(
473
+ default_factory=datetime.datetime.now,
474
+ metadata=MetadataDict(
475
+ db_field=("updated_at", "timestamptz"),
476
+ store=True,
477
+ update=True,
478
+ serialize=SerializeType.DATETIME,
479
+ ),
480
+ )
481
+ """updated_at should be present in all tables and is updated automatically"""
482
+
483
+ #
484
+ disabled_at: datetime.datetime = field(
485
+ default_factory=datetime.datetime.now,
486
+ metadata=MetadataDict(
487
+ db_field=("disabled_at", "timestamptz"),
488
+ store=True,
489
+ update=True,
490
+ serialize=SerializeType.DATETIME,
491
+ ),
492
+ )
493
+
494
+ #
495
+ deleted_at: datetime.datetime = field(
496
+ default_factory=datetime.datetime.now,
497
+ metadata=MetadataDict(
498
+ db_field=("deleted_at", "timestamptz"),
499
+ store=True,
500
+ update=True,
501
+ serialize=SerializeType.DATETIME,
502
+ ),
426
503
  )
427
504
 
428
505
  def update_data(self) -> dict[str, Any] | None:
@@ -134,9 +134,7 @@ class DBIntrospector:
134
134
  # Default value choice
135
135
  default = None
136
136
  default_factory = None
137
- if c.is_nullable:
138
- default = None
139
- else:
137
+ if c.is_nullable == False:
140
138
  # give some sane defaults for common not-nullables that aren't id/serial
141
139
  if py_type is bool:
142
140
  default = False
@@ -370,7 +368,7 @@ class DBIntrospector:
370
368
 
371
369
  return "\n".join(lines)
372
370
 
373
- def save_to_file(self, class_model_source: str, filepath: str, overwrite: bool) -> str:
371
+ def save_to_file(self, class_model_source: str, filepath: str | Path, overwrite: bool) -> str:
374
372
  """
375
373
  Render `cls` to a Python source file and save it to `filepath`.
376
374
 
@@ -281,6 +281,21 @@ class DBWrapper(DBWrapperMixin):
281
281
 
282
282
  return status
283
283
 
284
+ def insert_data(
285
+ self,
286
+ record: DBDataModel,
287
+ store_data: dict[str, Any],
288
+ ) -> tuple[int, int]:
289
+ status = self._insert(
290
+ record,
291
+ record.schema_name,
292
+ record.table_name,
293
+ store_data,
294
+ record.id_key,
295
+ )
296
+
297
+ return status
298
+
284
299
  def _update(
285
300
  self,
286
301
  empty_data_class: DBDataModel,
@@ -308,9 +323,7 @@ class DBWrapper(DBWrapperMixin):
308
323
 
309
324
  table_identifier = self.make_identifier(schema_name, table_name)
310
325
  update_key = self.make_identifier(empty_data_class.table_alias, id_key)
311
- update_query = self._format_update_query(
312
- table_identifier, update_key, update_data
313
- )
326
+ update_query = self._format_update_query(table_identifier, update_key, update_data)
314
327
 
315
328
  # Log
316
329
  self.log_query(self.db_cursor, update_query, tuple(values))
@@ -41,7 +41,7 @@ class DBWrapperAsync(DBWrapperMixin):
41
41
  raise ValueError("Id value is not set")
42
42
 
43
43
  # Get the record
44
- res = self.fetch_all_records(
44
+ res = self.get_all(
45
45
  empty_data_class,
46
46
  id_key,
47
47
  id_value,
@@ -73,7 +73,7 @@ class DBWrapperAsync(DBWrapperMixin):
73
73
  DataModelType | None: The result of the query.
74
74
  """
75
75
  # Get the record
76
- res = self.fetch_all_records(
76
+ res = self.get_all(
77
77
  empty_data_class,
78
78
  id_key,
79
79
  id_value,
@@ -85,7 +85,7 @@ class DBWrapperAsync(DBWrapperMixin):
85
85
  else:
86
86
  return None
87
87
 
88
- async def fetch_all_records(
88
+ async def get_all(
89
89
  self,
90
90
  empty_data_class: DataModelType,
91
91
  id_key: str | None = None,
@@ -283,6 +283,20 @@ class DBWrapperAsync(DBWrapperMixin):
283
283
 
284
284
  return status
285
285
 
286
+ async def insert_data(
287
+ self,
288
+ record: DBDataModel,
289
+ store_data: dict[str, Any],
290
+ ) -> tuple[int, int]:
291
+ status = await self._insert(
292
+ record,
293
+ record.schema_name,
294
+ record.table_name,
295
+ store_data,
296
+ record.id_key,
297
+ )
298
+ return status
299
+
286
300
  async def _update(
287
301
  self,
288
302
  empty_data_class: DBDataModel,
@@ -310,9 +324,7 @@ class DBWrapperAsync(DBWrapperMixin):
310
324
 
311
325
  table_identifier = self.make_identifier(schema_name, table_name)
312
326
  update_key = self.make_identifier(empty_data_class.table_alias, id_key)
313
- update_query = self._format_update_query(
314
- table_identifier, update_key, update_data
315
- )
327
+ update_query = self._format_update_query(table_identifier, update_key, update_data)
316
328
 
317
329
  # Log
318
330
  self.log_query(self.db_cursor, update_query, tuple(values))
@@ -330,9 +342,7 @@ class DBWrapperAsync(DBWrapperMixin):
330
342
  @overload
331
343
  async def update(self, records: list[DataModelType]) -> list[int]: ...
332
344
 
333
- async def update(
334
- self, records: DataModelType | list[DataModelType]
335
- ) -> int | list[int]:
345
+ async def update(self, records: DataModelType | list[DataModelType]) -> int | list[int]:
336
346
  """
337
347
  Updates a record or a list of records in the database.
338
348
 
@@ -438,9 +448,7 @@ class DBWrapperAsync(DBWrapperMixin):
438
448
  @overload
439
449
  async def delete(self, records: list[DataModelType]) -> list[int]: ...
440
450
 
441
- async def delete(
442
- self, records: DataModelType | list[DataModelType]
443
- ) -> int | list[int]:
451
+ async def delete(self, records: DataModelType | list[DataModelType]) -> int | list[int]:
444
452
  """
445
453
  Deletes a record or a list of records from the database.
446
454
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: database_wrapper
3
- Version: 0.2.9
3
+ Version: 0.2.13
4
4
  Summary: A Different Approach to Database Wrappers in Python
5
5
  Author-email: Gints Murans <gm@gm.lv>
6
6
  License: GNU General Public License v3.0 (GPL-3.0)
@@ -33,15 +33,15 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
33
33
  Requires-Python: >=3.8
34
34
  Description-Content-Type: text/markdown
35
35
  Provides-Extra: pgsql
36
- Requires-Dist: database_wrapper_pgsql==0.2.9; extra == "pgsql"
36
+ Requires-Dist: database_wrapper_pgsql==0.2.13; extra == "pgsql"
37
37
  Provides-Extra: mysql
38
- Requires-Dist: database_wrapper_mysql==0.2.9; extra == "mysql"
38
+ Requires-Dist: database_wrapper_mysql==0.2.13; extra == "mysql"
39
39
  Provides-Extra: mssql
40
- Requires-Dist: database_wrapper_mssql==0.2.9; extra == "mssql"
40
+ Requires-Dist: database_wrapper_mssql==0.2.13; extra == "mssql"
41
41
  Provides-Extra: sqlite
42
- Requires-Dist: database_wrapper_sqlite==0.2.9; extra == "sqlite"
42
+ Requires-Dist: database_wrapper_sqlite==0.2.13; extra == "sqlite"
43
43
  Provides-Extra: redis
44
- Requires-Dist: database_wrapper_redis==0.2.9; extra == "redis"
44
+ Requires-Dist: database_wrapper_redis==0.2.13; extra == "redis"
45
45
  Provides-Extra: all
46
46
  Requires-Dist: database_wrapper[mssql,mysql,pgsql,redis,sqlite]; extra == "all"
47
47
  Provides-Extra: dev
@@ -0,0 +1,18 @@
1
+ database_wrapper/__init__.py,sha256=cGqsWr7imdMOO7vrcGye8FVul_v3-32mw4wgrfxnhJA,1320
2
+ database_wrapper/abc.py,sha256=JiQo6Yfv7xALrrHeICJCSgmyP2gHrp16Ov83mPBTGbE,2058
3
+ database_wrapper/common.py,sha256=fsxe28o_4xCrotPbB274dmzQ9rOyes0sBtcHog-9RVc,258
4
+ database_wrapper/config.py,sha256=y4Y2g4sEbD1kgqLNpxsfkDqXHurMFfaJQiellYs09PE,334
5
+ database_wrapper/db_backend.py,sha256=pV_XGu0tR5naz7Ni6BvpqcmN9U7TdQ0bRkg7YiNZlO0,7928
6
+ database_wrapper/db_data_model.py,sha256=zhD_c1H5YV2f29DjBTQ5Oln99iO8hWdtcf-ijelWQnA,17000
7
+ database_wrapper/db_introspector.py,sha256=8sWNmBeumCE0D-cbpBvpMSTbCU6dpDLxCPB8HaNf6KA,15463
8
+ database_wrapper/db_wrapper.py,sha256=x6xsMW0epCOaj3RWWi9mj1EE1JmqM27PyS_Khvsxdvo,15231
9
+ database_wrapper/db_wrapper_async.py,sha256=ud7kCDfsfrbp3FHfRS7FjbsVTnnf87sHsxctpNWuhnk,15500
10
+ database_wrapper/db_wrapper_mixin.py,sha256=QCB9qjWLxeFY5f2_apJVL1rtp75spvZ1HuEApBkzID8,10071
11
+ database_wrapper/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ database_wrapper/serialization.py,sha256=Tti1-nA7H4g3hzqr3mE2WurxOnEjFaxBJZTOR3ONZSo,2906
13
+ database_wrapper/utils/__init__.py,sha256=uC8YaJqfyFIZIeNdTRTbZwcOUVhmnS5eyOG-9gMs70c,96
14
+ database_wrapper/utils/dataclass_addons.py,sha256=Og98FTL8_m07AjpAsbIdSkHQO099xt9asD3W2QasypY,759
15
+ database_wrapper-0.2.13.dist-info/METADATA,sha256=sD36XRl-81M6pJOM8QESSUVgQd7SrkPg4n9Bfvms1Pw,3615
16
+ database_wrapper-0.2.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
+ database_wrapper-0.2.13.dist-info/top_level.txt,sha256=QcnS4ocJygxcKE5eoOqriuja306oVu-zJRn6yjRRhBw,17
18
+ database_wrapper-0.2.13.dist-info/RECORD,,
@@ -1,18 +0,0 @@
1
- database_wrapper/__init__.py,sha256=cGqsWr7imdMOO7vrcGye8FVul_v3-32mw4wgrfxnhJA,1320
2
- database_wrapper/abc.py,sha256=JiQo6Yfv7xALrrHeICJCSgmyP2gHrp16Ov83mPBTGbE,2058
3
- database_wrapper/common.py,sha256=fsxe28o_4xCrotPbB274dmzQ9rOyes0sBtcHog-9RVc,258
4
- database_wrapper/config.py,sha256=ETbnBY7XXHlIiseyafmCP59I6DBYCFZdk4JO2v2fldQ,333
5
- database_wrapper/db_backend.py,sha256=pV_XGu0tR5naz7Ni6BvpqcmN9U7TdQ0bRkg7YiNZlO0,7928
6
- database_wrapper/db_data_model.py,sha256=6yMArPQPfbiFn9GvfRKYQzEh67LfaUn7JqkKTTCc7W8,14888
7
- database_wrapper/db_introspector.py,sha256=OsQDPr4Bp0SkekrIHIyKh4QX_bLrk7SOq4rbvzicKjE,15496
8
- database_wrapper/db_wrapper.py,sha256=zwaA-5BfUhBTG3eI-Im4BKztbKN0DQLg5heIR-rbQCo,14928
9
- database_wrapper/db_wrapper_async.py,sha256=EnF66zOJ9BEH2tQF-5v8hywEHl8KiryDM9l610ES7O0,15244
10
- database_wrapper/db_wrapper_mixin.py,sha256=QCB9qjWLxeFY5f2_apJVL1rtp75spvZ1HuEApBkzID8,10071
11
- database_wrapper/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- database_wrapper/serialization.py,sha256=Tti1-nA7H4g3hzqr3mE2WurxOnEjFaxBJZTOR3ONZSo,2906
13
- database_wrapper/utils/__init__.py,sha256=uC8YaJqfyFIZIeNdTRTbZwcOUVhmnS5eyOG-9gMs70c,96
14
- database_wrapper/utils/dataclass_addons.py,sha256=Og98FTL8_m07AjpAsbIdSkHQO099xt9asD3W2QasypY,759
15
- database_wrapper-0.2.9.dist-info/METADATA,sha256=8chFSBLQVJN7072NkmVtC0rO4Fp9L6KIe6veVsjQBcw,3609
16
- database_wrapper-0.2.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
- database_wrapper-0.2.9.dist-info/top_level.txt,sha256=QcnS4ocJygxcKE5eoOqriuja306oVu-zJRn6yjRRhBw,17
18
- database_wrapper-0.2.9.dist-info/RECORD,,