digitalhub 0.8.0b0__py3-none-any.whl → 0.8.0b1__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.

Potentially problematic release.


This version of digitalhub might be problematic. Click here for more details.

Files changed (159) hide show
  1. digitalhub/__init__.py +62 -94
  2. digitalhub/client/__init__.py +0 -0
  3. digitalhub/client/builder.py +105 -0
  4. digitalhub/client/objects/__init__.py +0 -0
  5. digitalhub/client/objects/base.py +56 -0
  6. digitalhub/client/objects/dhcore.py +681 -0
  7. digitalhub/client/objects/local.py +533 -0
  8. digitalhub/context/__init__.py +0 -0
  9. digitalhub/context/builder.py +178 -0
  10. digitalhub/context/context.py +136 -0
  11. digitalhub/datastores/__init__.py +0 -0
  12. digitalhub/datastores/builder.py +134 -0
  13. digitalhub/datastores/objects/__init__.py +0 -0
  14. digitalhub/datastores/objects/base.py +85 -0
  15. digitalhub/datastores/objects/local.py +42 -0
  16. digitalhub/datastores/objects/remote.py +23 -0
  17. digitalhub/datastores/objects/s3.py +38 -0
  18. digitalhub/datastores/objects/sql.py +60 -0
  19. digitalhub/entities/__init__.py +0 -0
  20. digitalhub/entities/_base/__init__.py +0 -0
  21. digitalhub/entities/_base/api.py +346 -0
  22. digitalhub/entities/_base/base.py +82 -0
  23. digitalhub/entities/_base/crud.py +610 -0
  24. digitalhub/entities/_base/entity/__init__.py +0 -0
  25. digitalhub/entities/_base/entity/base.py +132 -0
  26. digitalhub/entities/_base/entity/context.py +118 -0
  27. digitalhub/entities/_base/entity/executable.py +380 -0
  28. digitalhub/entities/_base/entity/material.py +214 -0
  29. digitalhub/entities/_base/entity/unversioned.py +87 -0
  30. digitalhub/entities/_base/entity/versioned.py +94 -0
  31. digitalhub/entities/_base/metadata.py +59 -0
  32. digitalhub/entities/_base/spec/__init__.py +0 -0
  33. digitalhub/entities/_base/spec/base.py +58 -0
  34. digitalhub/entities/_base/spec/material.py +22 -0
  35. digitalhub/entities/_base/state.py +31 -0
  36. digitalhub/entities/_base/status/__init__.py +0 -0
  37. digitalhub/entities/_base/status/base.py +32 -0
  38. digitalhub/entities/_base/status/material.py +49 -0
  39. digitalhub/entities/_builders/__init__.py +0 -0
  40. digitalhub/entities/_builders/metadata.py +60 -0
  41. digitalhub/entities/_builders/name.py +31 -0
  42. digitalhub/entities/_builders/spec.py +43 -0
  43. digitalhub/entities/_builders/status.py +62 -0
  44. digitalhub/entities/_builders/uuid.py +33 -0
  45. digitalhub/entities/artifact/__init__.py +0 -0
  46. digitalhub/entities/artifact/builder.py +133 -0
  47. digitalhub/entities/artifact/crud.py +358 -0
  48. digitalhub/entities/artifact/entity/__init__.py +0 -0
  49. digitalhub/entities/artifact/entity/_base.py +39 -0
  50. digitalhub/entities/artifact/entity/artifact.py +9 -0
  51. digitalhub/entities/artifact/spec.py +39 -0
  52. digitalhub/entities/artifact/status.py +15 -0
  53. digitalhub/entities/dataitem/__init__.py +0 -0
  54. digitalhub/entities/dataitem/builder.py +144 -0
  55. digitalhub/entities/dataitem/crud.py +395 -0
  56. digitalhub/entities/dataitem/entity/__init__.py +0 -0
  57. digitalhub/entities/dataitem/entity/_base.py +75 -0
  58. digitalhub/entities/dataitem/entity/dataitem.py +9 -0
  59. digitalhub/entities/dataitem/entity/iceberg.py +7 -0
  60. digitalhub/entities/dataitem/entity/table.py +125 -0
  61. digitalhub/entities/dataitem/models.py +62 -0
  62. digitalhub/entities/dataitem/spec.py +61 -0
  63. digitalhub/entities/dataitem/status.py +38 -0
  64. digitalhub/entities/entity_types.py +19 -0
  65. digitalhub/entities/function/__init__.py +0 -0
  66. digitalhub/entities/function/builder.py +86 -0
  67. digitalhub/entities/function/crud.py +305 -0
  68. digitalhub/entities/function/entity.py +101 -0
  69. digitalhub/entities/function/models.py +118 -0
  70. digitalhub/entities/function/spec.py +81 -0
  71. digitalhub/entities/function/status.py +9 -0
  72. digitalhub/entities/model/__init__.py +0 -0
  73. digitalhub/entities/model/builder.py +152 -0
  74. digitalhub/entities/model/crud.py +358 -0
  75. digitalhub/entities/model/entity/__init__.py +0 -0
  76. digitalhub/entities/model/entity/_base.py +34 -0
  77. digitalhub/entities/model/entity/huggingface.py +9 -0
  78. digitalhub/entities/model/entity/mlflow.py +90 -0
  79. digitalhub/entities/model/entity/model.py +9 -0
  80. digitalhub/entities/model/entity/sklearn.py +9 -0
  81. digitalhub/entities/model/models.py +26 -0
  82. digitalhub/entities/model/spec.py +146 -0
  83. digitalhub/entities/model/status.py +33 -0
  84. digitalhub/entities/project/__init__.py +0 -0
  85. digitalhub/entities/project/builder.py +82 -0
  86. digitalhub/entities/project/crud.py +350 -0
  87. digitalhub/entities/project/entity.py +2060 -0
  88. digitalhub/entities/project/spec.py +50 -0
  89. digitalhub/entities/project/status.py +9 -0
  90. digitalhub/entities/registries.py +48 -0
  91. digitalhub/entities/run/__init__.py +0 -0
  92. digitalhub/entities/run/builder.py +77 -0
  93. digitalhub/entities/run/crud.py +232 -0
  94. digitalhub/entities/run/entity.py +461 -0
  95. digitalhub/entities/run/spec.py +153 -0
  96. digitalhub/entities/run/status.py +114 -0
  97. digitalhub/entities/secret/__init__.py +0 -0
  98. digitalhub/entities/secret/builder.py +93 -0
  99. digitalhub/entities/secret/crud.py +294 -0
  100. digitalhub/entities/secret/entity.py +73 -0
  101. digitalhub/entities/secret/spec.py +35 -0
  102. digitalhub/entities/secret/status.py +9 -0
  103. digitalhub/entities/task/__init__.py +0 -0
  104. digitalhub/entities/task/builder.py +74 -0
  105. digitalhub/entities/task/crud.py +241 -0
  106. digitalhub/entities/task/entity.py +135 -0
  107. digitalhub/entities/task/models.py +199 -0
  108. digitalhub/entities/task/spec.py +51 -0
  109. digitalhub/entities/task/status.py +9 -0
  110. digitalhub/entities/utils.py +184 -0
  111. digitalhub/entities/workflow/__init__.py +0 -0
  112. digitalhub/entities/workflow/builder.py +91 -0
  113. digitalhub/entities/workflow/crud.py +304 -0
  114. digitalhub/entities/workflow/entity.py +77 -0
  115. digitalhub/entities/workflow/spec.py +15 -0
  116. digitalhub/entities/workflow/status.py +9 -0
  117. digitalhub/readers/__init__.py +0 -0
  118. digitalhub/readers/builder.py +54 -0
  119. digitalhub/readers/objects/__init__.py +0 -0
  120. digitalhub/readers/objects/base.py +70 -0
  121. digitalhub/readers/objects/pandas.py +207 -0
  122. digitalhub/readers/registry.py +15 -0
  123. digitalhub/registry/__init__.py +0 -0
  124. digitalhub/registry/models.py +87 -0
  125. digitalhub/registry/registry.py +74 -0
  126. digitalhub/registry/utils.py +150 -0
  127. digitalhub/runtimes/__init__.py +0 -0
  128. digitalhub/runtimes/base.py +164 -0
  129. digitalhub/runtimes/builder.py +53 -0
  130. digitalhub/runtimes/kind_registry.py +170 -0
  131. digitalhub/stores/__init__.py +0 -0
  132. digitalhub/stores/builder.py +257 -0
  133. digitalhub/stores/objects/__init__.py +0 -0
  134. digitalhub/stores/objects/base.py +189 -0
  135. digitalhub/stores/objects/local.py +230 -0
  136. digitalhub/stores/objects/remote.py +143 -0
  137. digitalhub/stores/objects/s3.py +563 -0
  138. digitalhub/stores/objects/sql.py +328 -0
  139. digitalhub/utils/__init__.py +0 -0
  140. digitalhub/utils/data_utils.py +127 -0
  141. digitalhub/utils/env_utils.py +123 -0
  142. digitalhub/utils/exceptions.py +55 -0
  143. digitalhub/utils/file_utils.py +204 -0
  144. digitalhub/utils/generic_utils.py +207 -0
  145. digitalhub/utils/git_utils.py +148 -0
  146. digitalhub/utils/io_utils.py +79 -0
  147. digitalhub/utils/logger.py +17 -0
  148. digitalhub/utils/uri_utils.py +56 -0
  149. {digitalhub-0.8.0b0.dist-info → digitalhub-0.8.0b1.dist-info}/METADATA +27 -12
  150. digitalhub-0.8.0b1.dist-info/RECORD +161 -0
  151. test/test_crud_artifacts.py +1 -1
  152. test/test_crud_dataitems.py +1 -1
  153. test/test_crud_functions.py +1 -1
  154. test/test_crud_runs.py +1 -1
  155. test/test_crud_tasks.py +1 -1
  156. digitalhub-0.8.0b0.dist-info/RECORD +0 -14
  157. {digitalhub-0.8.0b0.dist-info → digitalhub-0.8.0b1.dist-info}/LICENSE.txt +0 -0
  158. {digitalhub-0.8.0b0.dist-info → digitalhub-0.8.0b1.dist-info}/WHEEL +0 -0
  159. {digitalhub-0.8.0b0.dist-info → digitalhub-0.8.0b1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,136 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from pathlib import Path
5
+
6
+ if typing.TYPE_CHECKING:
7
+ from digitalhub.entities.project.entity._base import Project
8
+
9
+
10
+ class Context:
11
+ """
12
+ Context class built forom a `Project` instance. It contains
13
+ some information about the project, such as the project name,
14
+ a client instance (local or non-local), the local context
15
+ project path and information about client locality.
16
+ It exposes CRUD operations for the entities and act as a layer
17
+ between the project object and its client.
18
+ """
19
+
20
+ def __init__(self, project: Project) -> None:
21
+ self.name = project.name
22
+ self.client = project._client
23
+ self.local = project._client.is_local()
24
+ self.root = Path(project.spec.context)
25
+
26
+ def create_object(self, api: str, obj: dict, **kwargs) -> dict:
27
+ """
28
+ Create an object.
29
+
30
+ Parameters
31
+ ----------
32
+ api : str
33
+ Create API.
34
+ obj : dict
35
+ Object to create.
36
+ **kwargs : dict
37
+ Keyword arguments passed to the request.
38
+
39
+ Returns
40
+ -------
41
+ dict
42
+ Response object.
43
+ """
44
+ return self.client.create_object(api, obj, **kwargs)
45
+
46
+ def read_object(self, api: str, **kwargs) -> dict:
47
+ """
48
+ Read an object.
49
+
50
+ Parameters
51
+ ----------
52
+ api : str
53
+ Read API.
54
+ **kwargs : dict
55
+ Keyword arguments passed to the request.
56
+
57
+ Returns
58
+ -------
59
+ dict
60
+ Response object.
61
+ """
62
+ return self.client.read_object(api, **kwargs)
63
+
64
+ def update_object(self, api: str, obj: dict, **kwargs) -> dict:
65
+ """
66
+ Update an object.
67
+
68
+ Parameters
69
+ ----------
70
+ api : str
71
+ Update API.
72
+ obj : dict
73
+ Object to update.
74
+ **kwargs : dict
75
+ Keyword arguments passed to the request.
76
+
77
+ Returns
78
+ -------
79
+ dict
80
+ Response object.
81
+ """
82
+ return self.client.update_object(api, obj, **kwargs)
83
+
84
+ def delete_object(self, api: str, **kwargs) -> dict:
85
+ """
86
+ Delete an object.
87
+
88
+ Parameters
89
+ ----------
90
+ api : str
91
+ Delete API.
92
+ **kwargs : dict
93
+ Keyword arguments passed to the request.
94
+
95
+ Returns
96
+ -------
97
+ dict
98
+ Response object.
99
+ """
100
+ return self.client.delete_object(api, **kwargs)
101
+
102
+ def list_objects(self, api: str, **kwargs) -> dict:
103
+ """
104
+ List objects.
105
+
106
+ Parameters
107
+ ----------
108
+ api : str
109
+ The api to list the objects with.
110
+ **kwargs : dict
111
+ Keyword arguments passed to the request.
112
+
113
+ Returns
114
+ -------
115
+ dict
116
+ The list of objects.
117
+ """
118
+ return self.client.list_objects(api, **kwargs)
119
+
120
+ def list_first_object(self, api: str, **kwargs) -> dict:
121
+ """
122
+ List first objects.
123
+
124
+ Parameters
125
+ ----------
126
+ api : str
127
+ The api to list the objects with.
128
+ **kwargs : dict
129
+ Keyword arguments passed to the request.
130
+
131
+ Returns
132
+ -------
133
+ dict
134
+ The list of objects.
135
+ """
136
+ return self.client.list_first_object(api, **kwargs)
File without changes
@@ -0,0 +1,134 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.datastores.objects.local import LocalDatastore
6
+ from digitalhub.datastores.objects.remote import RemoteDatastore
7
+ from digitalhub.datastores.objects.s3 import S3Datastore
8
+ from digitalhub.datastores.objects.sql import SqlDatastore
9
+ from digitalhub.stores.builder import get_default_store, get_store
10
+ from digitalhub.utils.uri_utils import map_uri_scheme
11
+
12
+ if typing.TYPE_CHECKING:
13
+ from digitalhub.datastores.objects.base import Datastore
14
+ from digitalhub.stores.objects.base import Store
15
+
16
+
17
+ REGISTRY_DATASTORES = {"local": LocalDatastore, "remote": RemoteDatastore, "s3": S3Datastore, "sql": SqlDatastore}
18
+
19
+
20
+ class DatastoreBuilder:
21
+ """
22
+ Datastore builder class.
23
+ """
24
+
25
+ def __init__(self) -> None:
26
+ self._instances: dict[str, Datastore] = {}
27
+ self._default: Datastore | None = None
28
+ self._def_scheme = "s3"
29
+
30
+ def build(self, uri: str) -> None:
31
+ """
32
+ Build a datastore instance and register it.
33
+ It overrides any existing instance.
34
+
35
+ Parameters
36
+ ----------
37
+ uri : str
38
+ URI to parse.
39
+
40
+ Returns
41
+ -------
42
+ None
43
+ """
44
+ store = get_store(uri)
45
+ self._instances[store.type] = self.build_datastore(store)
46
+
47
+ def get(self, uri: str) -> Datastore:
48
+ """
49
+ Get a store instance by URI.
50
+
51
+ Parameters
52
+ ----------
53
+ uri : str
54
+ URI to parse.
55
+
56
+ Returns
57
+ -------
58
+ Datastore
59
+ The datastore instance.
60
+ """
61
+ scheme = map_uri_scheme(uri)
62
+ if scheme not in self._instances:
63
+ self.build(uri)
64
+ return self._instances[scheme]
65
+
66
+ def default(self) -> Datastore:
67
+ """
68
+ Get the default store instance.
69
+
70
+ Returns
71
+ -------
72
+ Datastore
73
+ The default datastore instance.
74
+ """
75
+ if self._default is None:
76
+ store = get_default_store()
77
+ self._default = self.build_datastore(store)
78
+ return self._default
79
+
80
+ def build_datastore(self, store: Store) -> Datastore:
81
+ """
82
+ Build a datastore instance.
83
+
84
+ Parameters
85
+ ----------
86
+ store : Store
87
+ Store instance.
88
+
89
+ Returns
90
+ -------
91
+ Datastore
92
+ The datastore instance.
93
+
94
+ Raises
95
+ ------
96
+ NotImplementedError
97
+ If the store type is not implemented.
98
+ """
99
+ try:
100
+ return REGISTRY_DATASTORES[store.type](store)
101
+ except KeyError as e:
102
+ raise NotImplementedError from e
103
+
104
+
105
+ builder = DatastoreBuilder()
106
+
107
+
108
+ def get_datastore(uri: str) -> Datastore:
109
+ """
110
+ Get a datastore instance by URI.
111
+
112
+ Parameters
113
+ ----------
114
+ uri : str
115
+ URI to parse.
116
+
117
+ Returns
118
+ -------
119
+ Datastore
120
+ The datastore instance.
121
+ """
122
+ return builder.get(uri)
123
+
124
+
125
+ def get_default_datastore() -> Datastore:
126
+ """
127
+ Get the default datastore instance.
128
+
129
+ Returns
130
+ -------
131
+ Datastore
132
+ The default datastore instance.
133
+ """
134
+ return builder.default()
File without changes
@@ -0,0 +1,85 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from abc import ABCMeta, abstractmethod
5
+ from typing import Any
6
+
7
+ from digitalhub.readers.builder import get_reader_by_engine
8
+
9
+ if typing.TYPE_CHECKING:
10
+ from digitalhub.stores.objects.base import Store
11
+
12
+
13
+ class Datastore(metaclass=ABCMeta):
14
+ """
15
+ Datastore abstract class.
16
+ """
17
+
18
+ def __init__(self, store: Store, **kwargs) -> None:
19
+ self.store = store
20
+
21
+ ##############################
22
+ # IO methods
23
+ ##############################
24
+
25
+ @abstractmethod
26
+ def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
27
+ """
28
+ Write DataFrame as parquet or csv.
29
+ """
30
+
31
+ def read_df(
32
+ self,
33
+ path: str | list[str],
34
+ extension: str,
35
+ engine: str | None = "pandas",
36
+ **kwargs,
37
+ ) -> Any:
38
+ """
39
+ Read DataFrame from path.
40
+
41
+ Parameters
42
+ ----------
43
+ path : str | list[str]
44
+ Path(s) to read DataFrame from.
45
+ extension : str
46
+ Extension of the file.
47
+ engine : str
48
+ Dataframe engine (pandas, polars, etc.).
49
+ **kwargs : dict
50
+ Keyword arguments.
51
+
52
+ Returns
53
+ -------
54
+ Any
55
+ DataFrame.
56
+ """
57
+ reader = get_reader_by_engine(engine)
58
+ self._validate_extension(extension)
59
+ return reader.read_df(path, extension, **kwargs)
60
+
61
+ ##############################
62
+ # Helper methods
63
+ ##############################
64
+
65
+ @staticmethod
66
+ def _validate_extension(extension: str) -> None:
67
+ """
68
+ Validate extension.
69
+
70
+ Parameters
71
+ ----------
72
+ extension : str
73
+ Extension of the file.
74
+
75
+ Returns
76
+ -------
77
+ None
78
+
79
+ Raises
80
+ ------
81
+ ValueError
82
+ If extension is not supported.
83
+ """
84
+ if extension not in ["csv", "parquet", "file"]:
85
+ raise ValueError(f"Extension {extension} not supported.")
@@ -0,0 +1,42 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ from typing import Any
5
+
6
+ from digitalhub.datastores.objects.base import Datastore
7
+ from digitalhub.readers.builder import get_reader_by_object
8
+
9
+
10
+ class LocalDatastore(Datastore):
11
+ """
12
+ Local Datastore class.
13
+ """
14
+
15
+ def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
16
+ """
17
+ Method to write a dataframe to a file. Kwargs are passed to df.to_parquet().
18
+ If destination is not provided, the dataframe is written to the default
19
+ store path with generated name.
20
+
21
+ Parameters
22
+ ----------
23
+ df : Any
24
+ The dataframe to write.
25
+ dst : str
26
+ The destination of the dataframe.
27
+ **kwargs : dict
28
+ Keyword arguments.
29
+
30
+ Returns
31
+ -------
32
+ str
33
+ Path of written dataframe.
34
+ """
35
+ self.store._check_local_dst(dst)
36
+ self._validate_extension(Path(dst).suffix.removeprefix("."))
37
+
38
+ # Write dataframe
39
+ reader = get_reader_by_object(df)
40
+ reader.write_df(df, dst, extension=extension, **kwargs)
41
+
42
+ return dst
@@ -0,0 +1,23 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from digitalhub.datastores.objects.base import Datastore
6
+
7
+
8
+ class RemoteDatastore(Datastore):
9
+ """
10
+ Remote Datastore class.
11
+ """
12
+
13
+ def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
14
+ """
15
+ Method to write a dataframe to a file. Note that this method is not implemented
16
+ since the remote store is not meant to write dataframes.
17
+
18
+ Raises
19
+ ------
20
+ NotImplementedError
21
+ This method is not implemented.
22
+ """
23
+ raise NotImplementedError("Remote store does not support write_df.")
@@ -0,0 +1,38 @@
1
+ from __future__ import annotations
2
+
3
+ from io import BytesIO
4
+ from typing import Any
5
+
6
+ from digitalhub.datastores.objects.base import Datastore
7
+ from digitalhub.readers.builder import get_reader_by_object
8
+
9
+
10
+ class S3Datastore(Datastore):
11
+ """
12
+ S3 Datastore class.
13
+ """
14
+
15
+ def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
16
+ """
17
+ Write a dataframe to S3 based storage. Kwargs are passed to df.to_parquet().
18
+
19
+ Parameters
20
+ ----------
21
+ df : Any
22
+ The dataframe.
23
+ dst : str
24
+ The destination path on S3 based storage.
25
+ **kwargs : dict
26
+ Keyword arguments.
27
+
28
+ Returns
29
+ -------
30
+ str
31
+ The S3 path where the dataframe was saved.
32
+ """
33
+ fileobj = BytesIO()
34
+ reader = get_reader_by_object(df)
35
+ reader.write_df(df, fileobj, extension=extension, **kwargs)
36
+
37
+ key = self.store._get_key(dst)
38
+ return self.store.upload_fileobject(fileobj, key)
@@ -0,0 +1,60 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from digitalhub.datastores.objects.base import Datastore
6
+ from digitalhub.readers.builder import get_reader_by_object
7
+
8
+
9
+ class SqlDatastore(Datastore):
10
+ """
11
+ Sql Datastore class.
12
+ """
13
+
14
+ def write_df(self, df: Any, dst: str, extension: str | None = None, **kwargs) -> str:
15
+ """
16
+ Write a dataframe to a database. Kwargs are passed to df.to_sql().
17
+
18
+ Parameters
19
+ ----------
20
+ df : Any
21
+ The dataframe to write.
22
+ dst : str
23
+ The destination of the dataframe.
24
+ **kwargs : dict
25
+ Keyword arguments.
26
+
27
+ Returns
28
+ -------
29
+ str
30
+ Path of written dataframe.
31
+ """
32
+ schema = self.store._get_schema(dst)
33
+ table = self.store._get_table_name(dst)
34
+ return self._upload_table(df, schema, table, **kwargs)
35
+
36
+ def _upload_table(self, df: Any, schema: str, table: str, **kwargs) -> str:
37
+ """
38
+ Upload a table to SQL based storage.
39
+
40
+ Parameters
41
+ ----------
42
+ df : DataFrame
43
+ The dataframe.
44
+ schema : str
45
+ Destination schema.
46
+ table : str
47
+ Destination table.
48
+ **kwargs : dict
49
+ Keyword arguments.
50
+
51
+ Returns
52
+ -------
53
+ str
54
+ The SQL URI where the dataframe was saved.
55
+ """
56
+ reader = get_reader_by_object(df)
57
+ engine = self.store._check_factory()
58
+ reader.write_table(df, table, engine, schema, **kwargs)
59
+ engine.dispose()
60
+ return f"sql://{engine.url.database}/{schema}/{table}"
File without changes
File without changes