1- from typing import List , Optional , Union
1+ from typing import List , Optional
22
3- from pydantic import BaseModel , Field
3+ from pydantic import BaseModel
44import minds .utils as utils
55import minds .exceptions as exc
66
77
8- class DatabaseConfigBase (BaseModel ):
8+ class Datasource (BaseModel ):
99 """
10- Base class
10+ Existed datasource. It is returned by this SDK when datasource is queried from server
1111 """
1212 name : str
13- tables : Union [List [str ], None ] = []
14-
15-
16- class DatabaseTables (DatabaseConfigBase ):
17- """
18- Used when only database and tables are required to be defined. For example in minds.create
19- """
20- ...
21-
22-
23- class DatabaseConfig (DatabaseConfigBase ):
24- """
25- Used to define datasource before creating it.
26- """
2713 engine : str
28- description : Union [str , None ] = ''
29- connection_data : Union [dict , None ] = {}
30-
31-
32- class Datasource (DatabaseConfig ):
33- """
34- Existed datasource. It is returned by this SDK when datasource is queried from server
35- """
36- ...
14+ description : Optional [str ] = None
15+ connection_data : Optional [dict ] = None
3716
3817
3918class Datasources :
4019 def __init__ (self , client ):
4120 self .api = client .api
4221
43- def create (self , ds_config : DatabaseConfig , update = False ):
44- """
45- Create new datasource and return it
46-
47- :param ds_config: datasource configuration, properties:
48- - name: str, name of datatasource
49- - engine: str, type of database handler, for example 'postgres', 'mysql', ...
50- - description: str, description of the database. Used by mind to know what data can be got from it.
51- - connection_data: dict, optional, credentials to connect to database
52- - tables: list of str, optional, list of allowed tables
53- :param update: if true - to update datasourse if exists, default is false
54- :return: datasource object
22+ def create (
23+ self ,
24+ name : str ,
25+ engine : str ,
26+ description : Optional [str ] = None ,
27+ connection_data : Optional [dict ] = None ,
28+ replace : bool = False ,
29+ ):
5530 """
31+ Create new datasource.
5632
57- name = ds_config .name
58-
33+ :param name: name of datasource.
34+ :param engine: type of database handler, for example 'postgres', 'mysql', ...
35+ :param description: str, optional, description of the database. Used by mind to know what data can be got from it.
36+ :param connection_data: dict, optional, credentials to connect to database.
37+ :return: Datasource object.
38+ """
5939 utils .validate_datasource_name (name )
6040
61- if update :
62- self .api .put (f'/datasources/{ name } ' , data = ds_config .model_dump ())
63- else :
64- self .api .post ('/datasources' , data = ds_config .model_dump ())
41+ if replace :
42+ try :
43+ self .get (name )
44+ self .drop (name )
45+ except exc .ObjectNotFound :
46+ ...
47+
48+ data = {
49+ 'name' : name ,
50+ 'engine' : engine ,
51+ }
52+ if connection_data is not None :
53+ data ['connection_data' ] = connection_data
54+ if description is not None :
55+ data ['description' ] = description
56+
57+ self .api .post (
58+ '/datasources' ,
59+ data = data
60+ )
6561 return self .get (name )
6662
6763 def list (self ) -> List [Datasource ]:
@@ -74,9 +70,6 @@ def list(self) -> List[Datasource]:
7470 data = self .api .get ('/datasources' ).json ()
7571 ds_list = []
7672 for item in data :
77- # TODO skip not sql skills
78- if item .get ('engine' ) is None :
79- continue
8073 ds_list .append (Datasource (** item ))
8174 return ds_list
8275
@@ -89,21 +82,12 @@ def get(self, name: str) -> Datasource:
8982 """
9083
9184 data = self .api .get (f'/datasources/{ name } ' ).json ()
92-
93- # TODO skip not sql skills
94- if data .get ('engine' ) is None :
95- raise exc .ObjectNotSupported (f'Wrong type of datasource: { name } ' )
9685 return Datasource (** data )
9786
98- def drop (self , name : str , force = False ):
87+ def drop (self , name : str ):
9988 """
10089 Drop datasource by name
10190
10291 :param name: name of datasource
103- :param force: if True - remove from all minds, default: False
10492 """
105- data = None
106- if force :
107- data = {'cascade' : True }
108-
109- self .api .delete (f'/datasources/{ name } ' , data = data )
93+ self .api .delete (f'/datasources/{ name } ' )
0 commit comments