Community: Add bind variable support for oracle adb docloader (#30937)

PR title:
Community: Add bind variable support for oracle adb docloader
Description:
This PR adds support of using bind variable to oracle adb doc loader
class, including minor document change.
Issue:
N/A
Dependencies:
No new dependencies.
This commit is contained in:
xsai9101 2025-04-21 05:47:33 -07:00 committed by GitHub
parent 9418c0d8a5
commit 335f089d6a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 15 deletions

View File

@ -36,10 +36,7 @@
"pip install oracledb" "pip install oracledb"
], ],
"metadata": { "metadata": {
"collapsed": false, "collapsed": false
"pycharm": {
"is_executing": true
}
} }
}, },
{ {
@ -51,10 +48,7 @@
"from settings import s" "from settings import s"
], ],
"metadata": { "metadata": {
"collapsed": false, "collapsed": false
"pycharm": {
"is_executing": true
}
} }
}, },
{ {
@ -97,16 +91,14 @@
"doc_2 = doc_loader_2.load()" "doc_2 = doc_loader_2.load()"
], ],
"metadata": { "metadata": {
"collapsed": false, "collapsed": false
"pycharm": {
"is_executing": true
}
} }
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"source": [ "source": [
"With TLS authentication, wallet_location and wallet_password are not required." "With TLS authentication, wallet_location and wallet_password are not required.\n",
"Bind variable option is provided by argument \"parameters\"."
], ],
"metadata": { "metadata": {
"collapsed": false "collapsed": false
@ -117,6 +109,8 @@
"execution_count": null, "execution_count": null,
"outputs": [], "outputs": [],
"source": [ "source": [
"SQL_QUERY = \"select channel_id, channel_desc from sh.channels where channel_desc = :1 fetch first 5 rows only\"\n",
"\n",
"doc_loader_3 = OracleAutonomousDatabaseLoader(\n", "doc_loader_3 = OracleAutonomousDatabaseLoader(\n",
" query=SQL_QUERY,\n", " query=SQL_QUERY,\n",
" user=s.USERNAME,\n", " user=s.USERNAME,\n",
@ -124,6 +118,7 @@
" schema=s.SCHEMA,\n", " schema=s.SCHEMA,\n",
" config_dir=s.CONFIG_DIR,\n", " config_dir=s.CONFIG_DIR,\n",
" tns_name=s.TNS_NAME,\n", " tns_name=s.TNS_NAME,\n",
" parameters=[\"Direct Sales\"],\n",
")\n", ")\n",
"doc_3 = doc_loader_3.load()\n", "doc_3 = doc_loader_3.load()\n",
"\n", "\n",
@ -133,6 +128,7 @@
" password=s.PASSWORD,\n", " password=s.PASSWORD,\n",
" schema=s.SCHEMA,\n", " schema=s.SCHEMA,\n",
" connection_string=s.CONNECTION_STRING,\n", " connection_string=s.CONNECTION_STRING,\n",
" parameters=[\"Direct Sales\"],\n",
")\n", ")\n",
"doc_4 = doc_loader_4.load()" "doc_4 = doc_loader_4.load()"
], ],

View File

@ -1,4 +1,4 @@
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional, Union
from langchain_core.documents import Document from langchain_core.documents import Document
@ -31,6 +31,7 @@ class OracleAutonomousDatabaseLoader(BaseLoader):
wallet_password: Optional[str] = None, wallet_password: Optional[str] = None,
connection_string: Optional[str] = None, connection_string: Optional[str] = None,
metadata: Optional[List[str]] = None, metadata: Optional[List[str]] = None,
parameters: Optional[Union[list, tuple, dict]] = None,
): ):
""" """
init method init method
@ -44,6 +45,7 @@ class OracleAutonomousDatabaseLoader(BaseLoader):
:param wallet_password: password of wallet :param wallet_password: password of wallet
:param connection_string: connection string to connect to adb instance :param connection_string: connection string to connect to adb instance
:param metadata: metadata used in document :param metadata: metadata used in document
:param parameters: bind variable to use in query
""" """
# Mandatory required arguments. # Mandatory required arguments.
self.query = query self.query = query
@ -67,6 +69,9 @@ class OracleAutonomousDatabaseLoader(BaseLoader):
# metadata column # metadata column
self.metadata = metadata self.metadata = metadata
# parameters, e.g bind variable
self.parameters = parameters
# dsn # dsn
self.dsn: Optional[str] self.dsn: Optional[str]
self._set_dsn() self._set_dsn()
@ -96,6 +101,9 @@ class OracleAutonomousDatabaseLoader(BaseLoader):
cursor = connection.cursor() cursor = connection.cursor()
if self.schema: if self.schema:
cursor.execute(f"alter session set current_schema={self.schema}") cursor.execute(f"alter session set current_schema={self.schema}")
if self.parameters:
cursor.execute(self.query, self.parameters)
else:
cursor.execute(self.query) cursor.execute(self.query)
columns = [col[0] for col in cursor.description] columns = [col[0] for col in cursor.description]
data = cursor.fetchall() data = cursor.fetchall()