[docs]classOracleAutonomousDatabaseLoader(BaseLoader):""" Load from oracle adb Autonomous Database connection can be made by either connection_string or tns name. wallet_location and wallet_password are required for TLS connection. Each document will represent one row of the query result. Columns are written into the `page_content` and 'metadata' in constructor is written into 'metadata' of document, by default, the 'metadata' is None. """
[docs]def__init__(self,query:str,user:str,password:str,*,schema:Optional[str]=None,tns_name:Optional[str]=None,config_dir:Optional[str]=None,wallet_location:Optional[str]=None,wallet_password:Optional[str]=None,connection_string:Optional[str]=None,metadata:Optional[List[str]]=None,):""" init method :param query: sql query to execute :param user: username :param password: user password :param schema: schema to run in database :param tns_name: tns name in tnsname.ora :param config_dir: directory of config files(tnsname.ora, wallet) :param wallet_location: location of wallet :param wallet_password: password of wallet :param connection_string: connection string to connect to adb instance :param metadata: metadata used in document """# Mandatory required arguments.self.query=queryself.user=userself.password=password# Schemaself.schema=schema# TNS connection Methodself.tns_name=tns_nameself.config_dir=config_dir# Wallet configuration is required for mTLS connectionself.wallet_location=wallet_locationself.wallet_password=wallet_password# Connection String connection methodself.connection_string=connection_string# metadata columnself.metadata=metadata# dsnself.dsn:Optional[str]self._set_dsn()
def_set_dsn(self)->None:ifself.connection_string:self.dsn=self.connection_stringelifself.tns_name:self.dsn=self.tns_namedef_run_query(self)->List[Dict[str,Any]]:try:importoracledbexceptImportErrorase:raiseImportError("Could not import oracledb, please install with 'pip install oracledb'")fromeconnect_param={"user":self.user,"password":self.password,"dsn":self.dsn}ifself.dsn==self.tns_name:connect_param["config_dir"]=self.config_dirifself.wallet_locationandself.wallet_password:connect_param["wallet_location"]=self.wallet_locationconnect_param["wallet_password"]=self.wallet_passwordtry:connection=oracledb.connect(**connect_param)cursor=connection.cursor()ifself.schema:cursor.execute(f"alter session set current_schema={self.schema}")cursor.execute(self.query)columns=[col[0]forcolincursor.description]data=cursor.fetchall()data=[{i:(jifnotisinstance(j,oracledb.LOB)elsej.read())fori,jinzip(columns,row)}forrowindata]exceptoracledb.DatabaseErrorase:print("Got error while connecting: "+str(e))# noqa: T201data=[]finally:cursor.close()connection.close()returndata