diff --git a/env.example b/env.example index 5eef3913..b82a4cf0 100644 --- a/env.example +++ b/env.example @@ -310,6 +310,11 @@ POSTGRES_IVFFLAT_LISTS=100 # POSTGRES_SSL_ROOT_CERT=/path/to/ca-cert.pem # POSTGRES_SSL_CRL=/path/to/crl.pem +### PostgreSQL Server Options (for Supabase Supavisor) +# Use this to pass extra options to the PostgreSQL connection string. +# For Supabase, you might need to set it like this: +# POSTGRES_SERVER_OPTIONS="options=reference%3D[project-ref]" + ### Neo4j Configuration NEO4J_URI=neo4j+s://xxxxxxxx.databases.neo4j.io NEO4J_USERNAME=neo4j diff --git a/lightrag/kg/postgres_impl.py b/lightrag/kg/postgres_impl.py index f22674c0..37b39b49 100644 --- a/lightrag/kg/postgres_impl.py +++ b/lightrag/kg/postgres_impl.py @@ -74,6 +74,9 @@ class PostgreSQLDB: self.hnsw_ef = config.get("hnsw_ef") self.ivfflat_lists = config.get("ivfflat_lists") + # Server settings + self.server_settings = config.get("server_settings") + if self.user is None or self.password is None or self.database is None: raise ValueError("Missing database user, password, or database") @@ -173,6 +176,24 @@ class PostgreSQLDB: connection_params["ssl"] = False logger.info(f"PostgreSQL, SSL mode set to: {self.ssl_mode}") + # Add server settings if provided + if self.server_settings: + try: + settings = {} + # The format is expected to be a query string, e.g., "key1=value1&key2=value2" + pairs = self.server_settings.split("&") + for pair in pairs: + if "=" in pair: + key, value = pair.split("=", 1) + settings[key] = value + if settings: + connection_params["server_settings"] = settings + logger.info(f"PostgreSQL, Server settings applied: {settings}") + except Exception as e: + logger.warning( + f"PostgreSQL, Failed to parse server_settings: {self.server_settings}, error: {e}" + ) + self.pool = await asyncpg.create_pool(**connection_params) # type: ignore # Ensure VECTOR extension is available @@ -828,8 +849,8 @@ class PostgreSQLDB: # Execute the migration alter_sql = f""" - ALTER TABLE {migration['table']} - ALTER COLUMN {migration['column']} TYPE {migration['new_type']} + ALTER TABLE {migration["table"]} + ALTER COLUMN {migration["column"]} TYPE {migration["new_type"]} """ await self.execute(alter_sql) @@ -1368,6 +1389,11 @@ class ClientManager: config.get("postgres", "ivfflat_lists", fallback="100"), ) ), + # Server settings for Supabase + "server_settings": os.environ.get( + "POSTGRES_SERVER_OPTIONS", + config.get("postgres", "server_options", fallback=None), + ), } @classmethod