{"record":{"id":"ab455e1c78d12077","repo":"crewAIInc/crewAI","slug":"database-uri-is-required-for-mysql-loader","errorCode":null,"errorMessage":"Database URI is required for MySQL loader","messagePattern":"Database URI is required for MySQL loader","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"lib/crewai-tools/src/crewai_tools/rag/loaders/mysql_loader.py","lineNumber":30,"sourceCode":"\nclass MySQLLoader(BaseLoader):\n    \"\"\"Loader for MySQL database content.\"\"\"\n\n    def load(self, source: SourceContent, **kwargs: Any) -> LoaderResult:  # type: ignore[override]\n        \"\"\"Load content from a MySQL database table.\n\n        Args:\n            source: SQL query (e.g., \"SELECT * FROM table_name\")\n            **kwargs: Additional arguments including db_uri\n\n        Returns:\n            LoaderResult with database content\n        \"\"\"\n        metadata = kwargs.get(\"metadata\", {})\n        db_uri = metadata.get(\"db_uri\")\n\n        if not db_uri:\n            raise ValueError(\"Database URI is required for MySQL loader\")\n\n        query = source.source\n\n        parsed = urlparse(db_uri)\n        if parsed.scheme not in [\"mysql\", \"mysql+pymysql\"]:\n            raise ValueError(f\"Invalid MySQL URI scheme: {parsed.scheme}\")\n\n        connection_params = {\n            \"host\": parsed.hostname or \"localhost\",\n            \"port\": parsed.port or 3306,\n            \"user\": parsed.username,\n            \"password\": parsed.password,\n            \"database\": parsed.path.lstrip(\"/\") if parsed.path else None,\n            \"charset\": \"utf8mb4\",\n            \"cursorclass\": DictCursor,\n        }\n\n        if not connection_params[\"database\"]:","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/crewAIInc/crewAI/blob/754d7323beb2fd042e33444a115ea2d5a47193f0/lib/crewai-tools/src/crewai_tools/rag/loaders/mysql_loader.py#L12-L48","documentation":"Raised by MySQLLoader.load() when metadata does not contain a non-empty 'db_uri' key. The loader takes its connection string exclusively from kwargs metadata (not from the source, which holds the SQL query); a missing, None, or empty db_uri fails fast before any parsing or connection attempt.","triggerScenarios":"Calling MySQLLoader().load(SourceContent('SELECT * FROM users')) with no kwargs at all; passing db_uri as a top-level kwarg instead of inside metadata; passing metadata={'db_uri': ''} or {'db_uri': None}.","commonSituations":"Confusing the API shape — the query is the source and the URI is buried in metadata; environments where the DB URI env var is unset so an empty string is forwarded; config helpers that drop keys with falsy values; copy-paste from PostgresLoader examples that use a different kwarg name.","solutions":["Pass the URI in metadata: MySQLLoader().load(SourceContent(query), metadata={'db_uri': os.environ['DATABASE_URI']}).","Fail loudly at startup if the env var is absent instead of forwarding None.","Check the kwarg name and nesting (metadata dict, not a flat kwarg) against the loader signature."],"exampleFix":"# before\nresult = MySQLLoader().load(SourceContent('SELECT 1'), db_uri='mysql://u:p@h/db')  # ignored\n\n# after\nimport os\nresult = MySQLLoader().load(\n    SourceContent('SELECT 1'),\n    metadata={'db_uri': os.environ['DATABASE_URI']},\n)","handlingStrategy":"validation","validationCode":"import os\\n\\ndef require_db_uri() -> str:\\n    uri = os.environ.get('MYSQL_URI')\\n    if not uri:\\n        raise RuntimeError('MYSQL_URI is not configured')\\n    return uri","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember the shape: query = SourceContent, connection = metadata={'db_uri': ...}.","Fail at startup when required env vars are missing.","Never pass db_uri as a flat kwarg — it is silently ignored."],"tags":["mysql","database","configuration","validation"],"backgroundTag":null,"analyzedSha":"754d7323beb2fd042e33444a115ea2d5a47193f0","analyzedAt":"2026-08-15T04:06:56.746Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}