feat: add db driver env variable (#5967)
* Add option to disable prepared statements * [autofix.ci] apply automated fixes * use generic connection driver env var * simplify and allow usage for sqlite * allow pool class to be set to kwargs * simplify pool class selection * [autofix.ci] apply automated fixes * use reflection to get poolclass * rebase fixes * [autofix.ci] apply automated fixes * [autofix.ci] apply automated fixes (attempt 2/3) --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
25ac555e8f
commit
45bac3714a
5 changed files with 53 additions and 17 deletions
|
|
@ -960,7 +960,9 @@
|
||||||
"key": "ParseData",
|
"key": "ParseData",
|
||||||
"legacy": false,
|
"legacy": false,
|
||||||
"lf_version": "1.1.5",
|
"lf_version": "1.1.5",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"legacy_name": "Parse Data"
|
||||||
|
},
|
||||||
"minimized": false,
|
"minimized": false,
|
||||||
"output_types": [],
|
"output_types": [],
|
||||||
"outputs": [
|
"outputs": [
|
||||||
|
|
@ -1011,7 +1013,7 @@
|
||||||
"show": true,
|
"show": true,
|
||||||
"title_case": false,
|
"title_case": false,
|
||||||
"type": "code",
|
"type": "code",
|
||||||
"value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text, data_to_text_list\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Data to Message\"\n description = \"Convert Data objects into Messages using any {field_name} from input data.\"\n icon = \"message-square\"\n name = \"ParseData\"\n\n inputs = [\n DataInput(name=\"data\", display_name=\"Data\", info=\"The data to convert to text.\", is_list=True, required=True),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. \"\n \"It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n required=True,\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(\n display_name=\"Message\",\n name=\"text\",\n info=\"Data as a single Message, with each input Data separated by Separator\",\n method=\"parse_data\",\n ),\n Output(\n display_name=\"Data List\",\n name=\"data_list\",\n info=\"Data as a list of new Data, each having `text` formatted by Template\",\n method=\"parse_data_as_list\",\n ),\n ]\n\n def _clean_args(self) -> tuple[list[Data], str, str]:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n sep = self.sep\n return data, template, sep\n\n def parse_data(self) -> Message:\n data, template, sep = self._clean_args()\n result_string = data_to_text(template, data, sep)\n self.status = result_string\n return Message(text=result_string)\n\n def parse_data_as_list(self) -> list[Data]:\n data, template, _ = self._clean_args()\n text_list, data_list = data_to_text_list(template, data)\n for item, text in zip(data_list, text_list, strict=True):\n item.set_text(text)\n self.status = data_list\n return data_list\n"
|
"value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text, data_to_text_list\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Data to Message\"\n description = \"Convert Data objects into Messages using any {field_name} from input data.\"\n icon = \"message-square\"\n name = \"ParseData\"\n metadata = {\n \"legacy_name\": \"Parse Data\",\n }\n\n inputs = [\n DataInput(\n name=\"data\",\n display_name=\"Data\",\n info=\"The data to convert to text.\",\n is_list=True,\n required=True,\n ),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. \"\n \"It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n required=True,\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(\n display_name=\"Message\",\n name=\"text\",\n info=\"Data as a single Message, with each input Data separated by Separator\",\n method=\"parse_data\",\n ),\n Output(\n display_name=\"Data List\",\n name=\"data_list\",\n info=\"Data as a list of new Data, each having `text` formatted by Template\",\n method=\"parse_data_as_list\",\n ),\n ]\n\n def _clean_args(self) -> tuple[list[Data], str, str]:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n sep = self.sep\n return data, template, sep\n\n def parse_data(self) -> Message:\n data, template, sep = self._clean_args()\n result_string = data_to_text(template, data, sep)\n self.status = result_string\n return Message(text=result_string)\n\n def parse_data_as_list(self) -> list[Data]:\n data, template, _ = self._clean_args()\n text_list, data_list = data_to_text_list(template, data)\n for item, text in zip(data_list, text_list, strict=True):\n item.set_text(text)\n self.status = data_list\n return data_list\n"
|
||||||
},
|
},
|
||||||
"data": {
|
"data": {
|
||||||
"_input_type": "DataInput",
|
"_input_type": "DataInput",
|
||||||
|
|
|
||||||
|
|
@ -452,7 +452,9 @@
|
||||||
"icon": "message-square",
|
"icon": "message-square",
|
||||||
"legacy": false,
|
"legacy": false,
|
||||||
"lf_version": "1.1.5",
|
"lf_version": "1.1.5",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"legacy_name": "Parse Data"
|
||||||
|
},
|
||||||
"minimized": false,
|
"minimized": false,
|
||||||
"output_types": [],
|
"output_types": [],
|
||||||
"outputs": [
|
"outputs": [
|
||||||
|
|
@ -502,7 +504,7 @@
|
||||||
"show": true,
|
"show": true,
|
||||||
"title_case": false,
|
"title_case": false,
|
||||||
"type": "code",
|
"type": "code",
|
||||||
"value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text, data_to_text_list\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Data to Message\"\n description = \"Convert Data objects into Messages using any {field_name} from input data.\"\n icon = \"message-square\"\n name = \"ParseData\"\n\n inputs = [\n DataInput(name=\"data\", display_name=\"Data\", info=\"The data to convert to text.\", is_list=True, required=True),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. \"\n \"It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n required=True,\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(\n display_name=\"Message\",\n name=\"text\",\n info=\"Data as a single Message, with each input Data separated by Separator\",\n method=\"parse_data\",\n ),\n Output(\n display_name=\"Data List\",\n name=\"data_list\",\n info=\"Data as a list of new Data, each having `text` formatted by Template\",\n method=\"parse_data_as_list\",\n ),\n ]\n\n def _clean_args(self) -> tuple[list[Data], str, str]:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n sep = self.sep\n return data, template, sep\n\n def parse_data(self) -> Message:\n data, template, sep = self._clean_args()\n result_string = data_to_text(template, data, sep)\n self.status = result_string\n return Message(text=result_string)\n\n def parse_data_as_list(self) -> list[Data]:\n data, template, _ = self._clean_args()\n text_list, data_list = data_to_text_list(template, data)\n for item, text in zip(data_list, text_list, strict=True):\n item.set_text(text)\n self.status = data_list\n return data_list\n"
|
"value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text, data_to_text_list\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Data to Message\"\n description = \"Convert Data objects into Messages using any {field_name} from input data.\"\n icon = \"message-square\"\n name = \"ParseData\"\n metadata = {\n \"legacy_name\": \"Parse Data\",\n }\n\n inputs = [\n DataInput(\n name=\"data\",\n display_name=\"Data\",\n info=\"The data to convert to text.\",\n is_list=True,\n required=True,\n ),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. \"\n \"It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n required=True,\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(\n display_name=\"Message\",\n name=\"text\",\n info=\"Data as a single Message, with each input Data separated by Separator\",\n method=\"parse_data\",\n ),\n Output(\n display_name=\"Data List\",\n name=\"data_list\",\n info=\"Data as a list of new Data, each having `text` formatted by Template\",\n method=\"parse_data_as_list\",\n ),\n ]\n\n def _clean_args(self) -> tuple[list[Data], str, str]:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n sep = self.sep\n return data, template, sep\n\n def parse_data(self) -> Message:\n data, template, sep = self._clean_args()\n result_string = data_to_text(template, data, sep)\n self.status = result_string\n return Message(text=result_string)\n\n def parse_data_as_list(self) -> list[Data]:\n data, template, _ = self._clean_args()\n text_list, data_list = data_to_text_list(template, data)\n for item, text in zip(data_list, text_list, strict=True):\n item.set_text(text)\n self.status = data_list\n return data_list\n"
|
||||||
},
|
},
|
||||||
"data": {
|
"data": {
|
||||||
"_input_type": "DataInput",
|
"_input_type": "DataInput",
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -124,6 +124,15 @@ class DatabaseService(Service):
|
||||||
# if the user specifies an empty dict, we allow it.
|
# if the user specifies an empty dict, we allow it.
|
||||||
kwargs = self._build_connection_kwargs()
|
kwargs = self._build_connection_kwargs()
|
||||||
|
|
||||||
|
poolclass_key = kwargs.get("poolclass")
|
||||||
|
if poolclass_key is not None:
|
||||||
|
pool_class = getattr(sa, poolclass_key, None)
|
||||||
|
if pool_class and isinstance(pool_class(), sa.pool.Pool):
|
||||||
|
logger.debug(f"Using poolclass: {poolclass_key}.")
|
||||||
|
kwargs["poolclass"] = pool_class
|
||||||
|
else:
|
||||||
|
logger.error(f"Invalid poolclass '{poolclass_key}' specified. Using default pool class.")
|
||||||
|
|
||||||
return create_async_engine(
|
return create_async_engine(
|
||||||
self.database_url,
|
self.database_url,
|
||||||
connect_args=self._get_connect_args(),
|
connect_args=self._get_connect_args(),
|
||||||
|
|
@ -136,16 +145,18 @@ class DatabaseService(Service):
|
||||||
return self._create_engine()
|
return self._create_engine()
|
||||||
|
|
||||||
def _get_connect_args(self):
|
def _get_connect_args(self):
|
||||||
if self.settings_service.settings.database_url and self.settings_service.settings.database_url.startswith(
|
settings = self.settings_service.settings
|
||||||
"sqlite"
|
|
||||||
):
|
if settings.db_driver_connection_settings is not None:
|
||||||
connect_args = {
|
return settings.db_driver_connection_settings
|
||||||
|
|
||||||
|
if settings.database_url and settings.database_url.startswith("sqlite"):
|
||||||
|
return {
|
||||||
"check_same_thread": False,
|
"check_same_thread": False,
|
||||||
"timeout": self.settings_service.settings.db_connect_timeout,
|
"timeout": settings.db_connect_timeout,
|
||||||
}
|
}
|
||||||
else:
|
|
||||||
connect_args = {}
|
return {}
|
||||||
return connect_args
|
|
||||||
|
|
||||||
def on_connection(self, dbapi_connection, _connection_record) -> None:
|
def on_connection(self, dbapi_connection, _connection_record) -> None:
|
||||||
if isinstance(dbapi_connection, sqlite3.Connection | dialect_sqlite.aiosqlite.AsyncAdapt_aiosqlite_connection):
|
if isinstance(dbapi_connection, sqlite3.Connection | dialect_sqlite.aiosqlite.AsyncAdapt_aiosqlite_connection):
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,9 @@ class Settings(BaseSettings):
|
||||||
sqlite_pragmas: dict | None = {"synchronous": "NORMAL", "journal_mode": "WAL"}
|
sqlite_pragmas: dict | None = {"synchronous": "NORMAL", "journal_mode": "WAL"}
|
||||||
"""SQLite pragmas to use when connecting to the database."""
|
"""SQLite pragmas to use when connecting to the database."""
|
||||||
|
|
||||||
|
db_driver_connection_settings: dict | None = None
|
||||||
|
"""Database driver connection settings."""
|
||||||
|
|
||||||
db_connection_settings: dict | None = {
|
db_connection_settings: dict | None = {
|
||||||
"pool_size": 20, # Match the pool_size above
|
"pool_size": 20, # Match the pool_size above
|
||||||
"max_overflow": 30, # Match the max_overflow above
|
"max_overflow": 30, # Match the max_overflow above
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue