diff --git a/libs/community/langchain_community/document_loaders/cratedb.py b/libs/community/langchain_community/document_loaders/cratedb.py index 8aa304e0c7762..a97b4dde8f354 100644 --- a/libs/community/langchain_community/document_loaders/cratedb.py +++ b/libs/community/langchain_community/document_loaders/cratedb.py @@ -1,5 +1,5 @@ -from langchain_community.document_loaders.sqlalchemy import SQLAlchemyLoader +from langchain_community.document_loaders.sql_database import SQLDatabaseLoader -class CrateDBLoader(SQLAlchemyLoader): +class CrateDBLoader(SQLDatabaseLoader): pass diff --git a/libs/community/langchain_community/document_loaders/sqlalchemy.py b/libs/community/langchain_community/document_loaders/sqlalchemy.py deleted file mode 100644 index 856d4fb105a36..0000000000000 --- a/libs/community/langchain_community/document_loaders/sqlalchemy.py +++ /dev/null @@ -1,112 +0,0 @@ -from typing import Dict, List, Optional, Union - -import sqlalchemy as sa - -from langchain_community.docstore.document import Document -from langchain_community.document_loaders.base import BaseLoader - - -class SQLAlchemyLoader(BaseLoader): - """ - Load documents by querying database tables supported by SQLAlchemy. - Each document represents one row of the result. - """ - - def __init__( - self, - query: Union[str, sa.Select], - url: str, - page_content_columns: Optional[List[str]] = None, - metadata_columns: Optional[List[str]] = None, - source_columns: Optional[List[str]] = None, - include_rownum_into_metadata: bool = False, - include_query_into_metadata: bool = False, - sqlalchemy_kwargs: Optional[Dict] = None, - ): - """ - - Args: - query: The query to execute. - url: The SQLAlchemy connection string of the database to connect to. - page_content_columns: The columns to write into the `page_content` - of the document. Optional. - metadata_columns: The columns to write into the `metadata` of the document. - Optional. - source_columns: The names of the columns to use as the `source` within the - metadata dictionary. Optional. - include_rownum_into_metadata: Whether to include the row number into the - metadata dictionary. Optional. Default: False. - include_query_into_metadata: Whether to include the query expression into - the metadata dictionary. Optional. Default: False. - sqlalchemy_kwargs: More keyword arguments for SQLAlchemy's `create_engine`. - """ - self.query = query - self.url = url - self.page_content_columns = page_content_columns - self.metadata_columns = metadata_columns - self.source_columns = source_columns - self.include_rownum_into_metadata = include_rownum_into_metadata - self.include_query_into_metadata = include_query_into_metadata - self.sqlalchemy_kwargs = sqlalchemy_kwargs or {} - - def load(self) -> List[Document]: - try: - import sqlalchemy as sa - except ImportError: - raise ImportError( - "Could not import sqlalchemy python package. " - "Please install it with `pip install sqlalchemy`." - ) - - engine = sa.create_engine(self.url, **self.sqlalchemy_kwargs) - - docs = [] - with engine.connect() as conn: - if isinstance(self.query, sa.Select): - result = conn.execute(self.query) - query_sql = str(self.query.compile(bind=engine)) - elif isinstance(self.query, str): - result = conn.execute(sa.text(self.query)) - query_sql = self.query - else: - raise TypeError( - f"Unable to process query of unknown type: {self.query}" - ) - field_names = list(result.mappings().keys()) - - if self.page_content_columns is None: - page_content_columns = field_names - else: - page_content_columns = self.page_content_columns - - if self.metadata_columns is None: - metadata_columns = [] - else: - metadata_columns = self.metadata_columns - - for i, row in enumerate(result.mappings()): - page_content = "\n".join( - f"{column}: {value}" - for column, value in row.items() - if column in page_content_columns - ) - - metadata: Dict[str, Union[str, int]] = {} - if self.include_rownum_into_metadata: - metadata["row"] = i - if self.include_query_into_metadata: - metadata["query"] = query_sql - - source_values = [] - for column, value in row.items(): - if column in metadata_columns: - metadata[column] = value - if self.source_columns and column in self.source_columns: - source_values.append(value) - if source_values: - metadata["source"] = ",".join(source_values) - - doc = Document(page_content=page_content, metadata=metadata) - docs.append(doc) - - return docs diff --git a/libs/community/tests/integration_tests/document_loaders/test_sql_database.py b/libs/community/tests/integration_tests/document_loaders/test_sql_database.py index 911fcd07676bd..9731c544afbd3 100644 --- a/libs/community/tests/integration_tests/document_loaders/test_sql_database.py +++ b/libs/community/tests/integration_tests/document_loaders/test_sql_database.py @@ -46,6 +46,14 @@ warnings.warn("psycopg2 not installed, skipping corresponding tests", UserWarning) psycopg2_installed = False +try: + import crate.client.sqlalchemy # noqa: F401 + + cratedb_installed = True +except ImportError: + warnings.warn("cratedb not installed, skipping corresponding tests", UserWarning) + cratedb_installed = False + @pytest.fixture() def engine(db_uri: str) -> sa.Engine: @@ -74,6 +82,9 @@ def provision_database(engine: sa.Engine) -> None: continue connection.execute(sa.text(statement)) connection.commit() + if engine.dialect.name.startswith("crate"): + connection.execute(sa.text("REFRESH TABLE mlb_teams_2012;")) + connection.commit() tmpdir = TemporaryDirectory() @@ -102,6 +113,18 @@ def pytest_generate_tests(metafunc: "Metafunc") -> None: "postgresql+psycopg2://langchain:langchain@localhost:6023/langchain" ) ids.append("postgresql") + if cratedb_installed: + # We use non-standard port for testing purposes. + # The easiest way to spin up the PostgreSQL instance is to use + # the docker compose file at the root of the repo located at + # langchain/docker/docker-compose.yml + # use `docker compose up postgres` to start the instance + # it will have the appropriate credentials set up including + # being exposed on the appropriate port. + urls.append( + "crate://crate@localhost/?schema=testdrive" + ) + ids.append("cratedb") metafunc.parametrize("db_uri", urls, ids=ids) diff --git a/libs/community/tests/integration_tests/document_loaders/test_sqlalchemy_cratedb.py b/libs/community/tests/integration_tests/document_loaders/test_sqlalchemy_cratedb.py deleted file mode 100644 index 6cd42439024e0..0000000000000 --- a/libs/community/tests/integration_tests/document_loaders/test_sqlalchemy_cratedb.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -Test SQLAlchemy/CrateDB document loader functionality. - -cd tests/integration_tests/document_loaders/docker-compose -docker-compose -f cratedb.yml up -""" -import logging -import os -import unittest - -import pytest -import sqlalchemy as sa -import sqlparse - -from langchain_community.document_loaders import CrateDBLoader -from tests.data import MLB_TEAMS_2012_SQL - -logging.basicConfig(level=logging.DEBUG) - -try: - import crate.client.sqlalchemy # noqa: F401 - - crate_client_installed = True -except ImportError: - crate_client_installed = False - - -CONNECTION_STRING = os.environ.get( - "TEST_CRATEDB_CONNECTION_STRING", "crate://crate@localhost/?schema=testdrive" -) - - -@pytest.fixture -def engine() -> sa.Engine: - """ - Return an SQLAlchemy engine object. - """ - return sa.create_engine(CONNECTION_STRING, echo=False) - - -@pytest.fixture() -def provision_database(engine: sa.Engine) -> None: - """ - Provision database with table schema and data. - """ - sql_statements = MLB_TEAMS_2012_SQL.read_text() - with engine.connect() as connection: - connection.execute(sa.text("DROP TABLE IF EXISTS mlb_teams_2012;")) - for statement in sqlparse.split(sql_statements): - connection.execute(sa.text(statement)) - connection.execute(sa.text("REFRESH TABLE mlb_teams_2012;")) - connection.commit() - - -@unittest.skipIf(not crate_client_installed, "CrateDB client not installed") -def test_cratedb_loader_no_options() -> None: - """Test SQLAlchemy loader with CrateDB.""" - - loader = CrateDBLoader("SELECT 1 AS a, 2 AS b", url=CONNECTION_STRING) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1\nb: 2" - assert docs[0].metadata == {} - - -@unittest.skipIf(not crate_client_installed, "CrateDB client not installed") -def test_cratedb_loader_page_content_columns() -> None: - """Test SQLAlchemy loader with CrateDB.""" - - loader = CrateDBLoader( - "SELECT 1 AS a, 2 AS b UNION SELECT 3 AS a, 4 AS b", - url=CONNECTION_STRING, - page_content_columns=["a"], - ) - docs = loader.load() - - assert len(docs) == 2 - assert docs[0].page_content == "a: 1" - assert docs[0].metadata == {} - - assert docs[1].page_content == "a: 3" - assert docs[1].metadata == {} - - -@unittest.skipIf(not crate_client_installed, "CrateDB client not installed") -def test_cratedb_loader_metadata_columns() -> None: - """Test SQLAlchemy loader with CrateDB.""" - - loader = CrateDBLoader( - "SELECT 1 AS a, 2 AS b", - url=CONNECTION_STRING, - page_content_columns=["a"], - metadata_columns=["b"], - ) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1" - assert docs[0].metadata == {"b": 2} - - -@unittest.skipIf(not crate_client_installed, "CrateDB client not installed") -def test_cratedb_loader_real_data_with_sql(provision_database: None) -> None: - """Test SQLAlchemy loader with CrateDB.""" - - loader = CrateDBLoader( - query='SELECT * FROM mlb_teams_2012 ORDER BY "Team";', - url=CONNECTION_STRING, - ) - docs = loader.load() - - assert len(docs) == 30 - assert docs[0].page_content == "Team: Angels\nPayroll (millions): 154.49\nWins: 89" - assert docs[0].metadata == {} - - -@unittest.skipIf(not crate_client_installed, "CrateDB client not installed") -def test_cratedb_loader_real_data_with_selectable(provision_database: None) -> None: - """Test SQLAlchemy loader with CrateDB.""" - - # Define an SQLAlchemy table. - mlb_teams_2012 = sa.Table( - "mlb_teams_2012", - sa.MetaData(), - sa.Column("Team", sa.VARCHAR), - sa.Column("Payroll (millions)", sa.FLOAT), - sa.Column("Wins", sa.BIGINT), - ) - - # Query the database table using an SQLAlchemy selectable. - select = sa.select(mlb_teams_2012).order_by(mlb_teams_2012.c.Team) - loader = CrateDBLoader( - query=select, - url=CONNECTION_STRING, - include_query_into_metadata=True, - ) - docs = loader.load() - - assert len(docs) == 30 - assert docs[0].page_content == "Team: Angels\nPayroll (millions): 154.49\nWins: 89" - assert docs[0].metadata == { - "query": 'SELECT mlb_teams_2012."Team", mlb_teams_2012."Payroll (millions)", ' - 'mlb_teams_2012."Wins" \nFROM mlb_teams_2012 ' - 'ORDER BY mlb_teams_2012."Team"' - } diff --git a/libs/community/tests/integration_tests/document_loaders/test_sqlalchemy_postgresql.py b/libs/community/tests/integration_tests/document_loaders/test_sqlalchemy_postgresql.py deleted file mode 100644 index 38dd6cfd62f09..0000000000000 --- a/libs/community/tests/integration_tests/document_loaders/test_sqlalchemy_postgresql.py +++ /dev/null @@ -1,179 +0,0 @@ -""" -Test SQLAlchemy/PostgreSQL document loader functionality. - -cd tests/integration_tests/document_loaders/docker-compose -docker-compose -f postgresql.yml up -""" -import logging -import os -import unittest - -import pytest -import sqlalchemy as sa -import sqlparse - -from langchain_community.document_loaders.sqlalchemy import SQLAlchemyLoader -from tests.data import MLB_TEAMS_2012_SQL - -logging.basicConfig(level=logging.DEBUG) - - -try: - import psycopg2 # noqa: F401 - - psycopg2_installed = True -except ImportError: - psycopg2_installed = False - - -CONNECTION_STRING = os.environ.get( - "TEST_POSTGRESQL_CONNECTION_STRING", - "postgresql+psycopg2://postgres@localhost:5432/", -) - - -@pytest.fixture -def engine() -> sa.Engine: - """ - Return an SQLAlchemy engine object. - """ - if not psycopg2_installed: - raise pytest.skip("psycopg2 not installed") - return sa.create_engine(CONNECTION_STRING, echo=False) - - -@pytest.fixture() -def provision_database(engine: sa.Engine) -> None: - """ - Provision database with table schema and data. - """ - sql_statements = MLB_TEAMS_2012_SQL.read_text() - with engine.connect() as connection: - connection.execute(sa.text("DROP TABLE IF EXISTS mlb_teams_2012;")) - for statement in sqlparse.split(sql_statements): - connection.execute(sa.text(statement)) - connection.commit() - - -@unittest.skipIf(not psycopg2_installed, "psycopg2 not installed") -def test_postgresql_loader_no_options() -> None: - """Test SQLAlchemy loader with psycopg2.""" - - loader = SQLAlchemyLoader("SELECT 1 AS a, 2 AS b", url=CONNECTION_STRING) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1\nb: 2" - assert docs[0].metadata == {} - - -@unittest.skipIf(not psycopg2_installed, "psycopg2 not installed") -def test_postgresql_loader_include_rownum_into_metadata() -> None: - """Test SQLAlchemy loader with psycopg2.""" - - loader = SQLAlchemyLoader( - "SELECT 1 AS a, 2 AS b", - url=CONNECTION_STRING, - include_rownum_into_metadata=True, - ) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1\nb: 2" - assert docs[0].metadata == {"row": 0} - - -@unittest.skipIf(not psycopg2_installed, "psycopg2 not installed") -def test_postgresql_loader_include_query_into_metadata() -> None: - """Test SQLAlchemy loader with psycopg2.""" - - loader = SQLAlchemyLoader( - "SELECT 1 AS a, 2 AS b", url=CONNECTION_STRING, include_query_into_metadata=True - ) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1\nb: 2" - assert docs[0].metadata == {"query": "SELECT 1 AS a, 2 AS b"} - - -@unittest.skipIf(not psycopg2_installed, "psycopg2 not installed") -def test_postgresql_loader_page_content_columns() -> None: - """Test SQLAlchemy loader with psycopg2.""" - - loader = SQLAlchemyLoader( - "SELECT 1 AS a, 2 AS b UNION SELECT 3 AS a, 4 AS b", - url=CONNECTION_STRING, - page_content_columns=["a"], - ) - docs = loader.load() - - assert len(docs) == 2 - assert docs[0].page_content == "a: 1" - assert docs[0].metadata == {} - - assert docs[1].page_content == "a: 3" - assert docs[1].metadata == {} - - -@unittest.skipIf(not psycopg2_installed, "psycopg2 not installed") -def test_postgresql_loader_metadata_columns() -> None: - """Test SQLAlchemy loader with psycopg2.""" - - loader = SQLAlchemyLoader( - "SELECT 1 AS a, 2 AS b", - url=CONNECTION_STRING, - page_content_columns=["a"], - metadata_columns=["b"], - ) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1" - assert docs[0].metadata == {"b": 2} - - -@unittest.skipIf(not psycopg2_installed, "psycopg2 not installed") -def test_postgresql_loader_real_data_with_sql(provision_database: None) -> None: - """Test SQLAlchemy loader with psycopg2.""" - - loader = SQLAlchemyLoader( - query='SELECT * FROM mlb_teams_2012 ORDER BY "Team";', - url=CONNECTION_STRING, - ) - docs = loader.load() - - assert len(docs) == 30 - assert docs[0].page_content == "Team: Angels\nPayroll (millions): 154.49\nWins: 89" - assert docs[0].metadata == {} - - -@unittest.skipIf(not psycopg2_installed, "psycopg2 not installed") -def test_postgresql_loader_real_data_with_selectable(provision_database: None) -> None: - """Test SQLAlchemy loader with psycopg2.""" - - # Define an SQLAlchemy table. - mlb_teams_2012 = sa.Table( - "mlb_teams_2012", - sa.MetaData(), - sa.Column("Team", sa.VARCHAR), - sa.Column("Payroll (millions)", sa.FLOAT), - sa.Column("Wins", sa.BIGINT), - ) - - # Query the database table using an SQLAlchemy selectable. - select = sa.select(mlb_teams_2012).order_by(mlb_teams_2012.c.Team) - loader = SQLAlchemyLoader( - query=select, - url=CONNECTION_STRING, - include_query_into_metadata=True, - ) - docs = loader.load() - - assert len(docs) == 30 - assert docs[0].page_content == "Team: Angels\nPayroll (millions): 154.49\nWins: 89" - assert docs[0].metadata == { - "query": 'SELECT mlb_teams_2012."Team", mlb_teams_2012."Payroll (millions)", ' - 'mlb_teams_2012."Wins" \nFROM mlb_teams_2012 ' - 'ORDER BY mlb_teams_2012."Team"' - } diff --git a/libs/community/tests/integration_tests/document_loaders/test_sqlalchemy_sqlite.py b/libs/community/tests/integration_tests/document_loaders/test_sqlalchemy_sqlite.py deleted file mode 100644 index 05759e5dea9ea..0000000000000 --- a/libs/community/tests/integration_tests/document_loaders/test_sqlalchemy_sqlite.py +++ /dev/null @@ -1,181 +0,0 @@ -""" -Test SQLAlchemy/SQLite document loader functionality. -""" -import logging -import unittest - -import pytest -import sqlalchemy as sa -import sqlparse -from _pytest.tmpdir import TempPathFactory - -from langchain_community.document_loaders.sqlalchemy import SQLAlchemyLoader -from tests.data import MLB_TEAMS_2012_SQL - -logging.basicConfig(level=logging.DEBUG) - - -try: - import sqlite3 # noqa: F401 - - sqlite3_installed = True -except ImportError: - sqlite3_installed = False - - -@pytest.fixture(scope="module") -def db_uri(tmp_path_factory: TempPathFactory) -> str: - """ - Return an SQLAlchemy URI for a temporary SQLite database. - """ - db_path = tmp_path_factory.getbasetemp().joinpath("testdrive.sqlite") - return f"sqlite:///{db_path}" - - -@pytest.fixture(scope="module") -def engine(db_uri: str) -> sa.Engine: - """ - Return an SQLAlchemy engine object. - """ - return sa.create_engine(db_uri, echo=False) - - -@pytest.fixture() -def provision_database(engine: sa.Engine) -> None: - """ - Provision database with table schema and data. - """ - sql_statements = MLB_TEAMS_2012_SQL.read_text() - with engine.connect() as connection: - connection.execute(sa.text("DROP TABLE IF EXISTS mlb_teams_2012;")) - for statement in sqlparse.split(sql_statements): - connection.execute(sa.text(statement)) - connection.commit() - - -@unittest.skipIf(not sqlite3_installed, "sqlite3 not installed") -def test_sqlite_loader_no_options(db_uri: str) -> None: - """Test SQLAlchemy loader with sqlite3.""" - - loader = SQLAlchemyLoader("SELECT 1 AS a, 2 AS b", url=db_uri) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1\nb: 2" - assert docs[0].metadata == {} - - -@unittest.skipIf(not sqlite3_installed, "sqlite3 not installed") -def test_sqlite_loader_include_rownum_into_metadata(db_uri: str) -> None: - """Test SQLAlchemy loader with sqlite3.""" - - loader = SQLAlchemyLoader( - "SELECT 1 AS a, 2 AS b", - url=db_uri, - include_rownum_into_metadata=True, - ) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1\nb: 2" - assert docs[0].metadata == {"row": 0} - - -@unittest.skipIf(not sqlite3_installed, "sqlite3 not installed") -def test_sqlite_loader_include_query_into_metadata(db_uri: str) -> None: - """Test SQLAlchemy loader with sqlite3.""" - - loader = SQLAlchemyLoader( - "SELECT 1 AS a, 2 AS b", url=db_uri, include_query_into_metadata=True - ) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1\nb: 2" - assert docs[0].metadata == {"query": "SELECT 1 AS a, 2 AS b"} - - -@unittest.skipIf(not sqlite3_installed, "sqlite3 not installed") -def test_sqlite_loader_page_content_columns(db_uri: str) -> None: - """Test SQLAlchemy loader with sqlite3.""" - - loader = SQLAlchemyLoader( - "SELECT 1 AS a, 2 AS b UNION SELECT 3 AS a, 4 AS b", - url=db_uri, - page_content_columns=["a"], - ) - docs = loader.load() - - assert len(docs) == 2 - assert docs[0].page_content == "a: 1" - assert docs[0].metadata == {} - - assert docs[1].page_content == "a: 3" - assert docs[1].metadata == {} - - -@unittest.skipIf(not sqlite3_installed, "sqlite3 not installed") -def test_sqlite_loader_metadata_columns(db_uri: str) -> None: - """Test SQLAlchemy loader with sqlite3.""" - - loader = SQLAlchemyLoader( - "SELECT 1 AS a, 2 AS b", - url=db_uri, - page_content_columns=["a"], - metadata_columns=["b"], - ) - docs = loader.load() - - assert len(docs) == 1 - assert docs[0].page_content == "a: 1" - assert docs[0].metadata == {"b": 2} - - -@unittest.skipIf(not sqlite3_installed, "sqlite3 not installed") -def test_sqlite_loader_real_data_with_sql( - db_uri: str, provision_database: None -) -> None: - """Test SQLAlchemy loader with sqlite3.""" - - loader = SQLAlchemyLoader( - query='SELECT * FROM mlb_teams_2012 ORDER BY "Team";', - url=db_uri, - ) - docs = loader.load() - - assert len(docs) == 30 - assert docs[0].page_content == "Team: Angels\nPayroll (millions): 154.49\nWins: 89" - assert docs[0].metadata == {} - - -@unittest.skipIf(not sqlite3_installed, "sqlite3 not installed") -def test_sqlite_loader_real_data_with_selectable( - db_uri: str, provision_database: None -) -> None: - """Test SQLAlchemy loader with sqlite3.""" - - # Define an SQLAlchemy table. - mlb_teams_2012 = sa.Table( - "mlb_teams_2012", - sa.MetaData(), - sa.Column("Team", sa.VARCHAR), - sa.Column("Payroll (millions)", sa.FLOAT), - sa.Column("Wins", sa.BIGINT), - ) - - # Query the database table using an SQLAlchemy selectable. - select = sa.select(mlb_teams_2012).order_by(mlb_teams_2012.c.Team) - loader = SQLAlchemyLoader( - query=select, - url=db_uri, - include_query_into_metadata=True, - ) - docs = loader.load() - - assert len(docs) == 30 - assert docs[0].page_content == "Team: Angels\nPayroll (millions): 154.49\nWins: 89" - assert docs[0].metadata == { - "query": 'SELECT mlb_teams_2012."Team", mlb_teams_2012."Payroll (millions)", ' - 'mlb_teams_2012."Wins" \nFROM mlb_teams_2012 ' - 'ORDER BY mlb_teams_2012."Team"' - } diff --git a/libs/community/tests/unit_tests/test_sql_database.py b/libs/community/tests/unit_tests/test_sql_database.py index da4c1ddbea6bd..8959b6ceaca31 100644 --- a/libs/community/tests/unit_tests/test_sql_database.py +++ b/libs/community/tests/unit_tests/test_sql_database.py @@ -1,7 +1,9 @@ # flake8: noqa: E501 """Test SQL database wrapper.""" + import pytest import sqlalchemy as sa +import sqlalchemy.orm from sqlalchemy import ( Column, Integer, @@ -51,6 +53,11 @@ def db_lazy_reflection(engine: sa.Engine) -> SQLDatabase: return SQLDatabase(engine, lazy_table_reflection=True) +def test_configure_mappers() -> None: + """Test that configuring table mappers works.""" + sqlalchemy.orm.configure_mappers() + + def test_table_info(db: SQLDatabase) -> None: """Test that table info is constructed properly.""" output = db.table_info diff --git a/libs/community/tests/unit_tests/test_sqlalchemy.py b/libs/community/tests/unit_tests/test_sqlalchemy.py deleted file mode 100644 index a434620155e00..0000000000000 --- a/libs/community/tests/unit_tests/test_sqlalchemy.py +++ /dev/null @@ -1,7 +0,0 @@ -import sqlalchemy.orm - -import langchain_community # noqa: F401 - - -def test_configure_mappers() -> None: - sqlalchemy.orm.configure_mappers()