2929 __supports_sqlalchemy_2x__ = False
3030
3131
32- def create_engine_url (host : str = "localhost" , port : int = 27017 , database : str = "test" , ** kwargs ) -> str :
32+ def create_engine_url (
33+ host : str = "localhost" , port : int = 27017 , database : str = "test" , mode : str = "standard" , ** kwargs
34+ ) -> str :
3335 """Create a SQLAlchemy engine URL for PyMongoSQL.
3436
3537 Args:
3638 host: MongoDB host
3739 port: MongoDB port
3840 database: Database name
41+ mode: Connection mode - "standard" (default) or "superset" (with subquery support)
3942 **kwargs: Additional connection parameters
4043
4144 Returns:
42- SQLAlchemy URL string (uses mongodb:// format)
45+ SQLAlchemy URL string
4346
4447 Example:
48+ >>> # Standard mode
4549 >>> url = create_engine_url("localhost", 27017, "mydb")
4650 >>> engine = sqlalchemy.create_engine(url)
51+ >>> # Superset mode with subquery support
52+ >>> url = create_engine_url("localhost", 27017, "mydb", mode="superset")
53+ >>> engine = sqlalchemy.create_engine(url)
4754 """
55+ scheme = "mongodb+superset" if mode == "superset" else "mongodb"
56+
4857 params = []
4958 for key , value in kwargs .items ():
5059 params .append (f"{ key } ={ value } " )
@@ -53,7 +62,7 @@ def create_engine_url(host: str = "localhost", port: int = 27017, database: str
5362 if param_str :
5463 param_str = "?" + param_str
5564
56- return f"mongodb ://{ host } :{ port } /{ database } { param_str } "
65+ return f"{ scheme } ://{ host } :{ port } /{ database } { param_str } "
5766
5867
5968def create_mongodb_url (mongodb_uri : str ) -> str :
@@ -77,11 +86,11 @@ def create_mongodb_url(mongodb_uri: str) -> str:
7786def create_engine_from_mongodb_uri (mongodb_uri : str , ** engine_kwargs ):
7887 """Create a SQLAlchemy engine from any MongoDB connection string.
7988
80- This function handles both mongodb:// and mongodb+srv :// URIs properly.
81- Use this instead of create_engine() directly for mongodb+srv URIs .
89+ This function handles mongodb://, mongodb+srv ://, and mongodb+superset :// URIs properly.
90+ Use this instead of create_engine() directly for special URI schemes .
8291
8392 Args:
84- mongodb_uri: Standard MongoDB connection string
93+ mongodb_uri: MongoDB connection string (supports standard, SRV, and superset modes)
8594 **engine_kwargs: Additional arguments passed to create_engine
8695
8796 Returns:
@@ -92,6 +101,8 @@ def create_engine_from_mongodb_uri(mongodb_uri: str, **engine_kwargs):
92101 >>> engine = create_engine_from_mongodb_uri("mongodb+srv://user:pass@cluster.net/db")
93102 >>> # For standard MongoDB
94103 >>> engine = create_engine_from_mongodb_uri("mongodb://localhost:27017/mydb")
104+ >>> # For superset mode (with subquery support)
105+ >>> engine = create_engine_from_mongodb_uri("mongodb+superset://localhost:27017/mydb")
95106 """
96107 try :
97108 from sqlalchemy import create_engine
@@ -109,6 +120,22 @@ def custom_create_connect_args(url):
109120 opts = {"host" : mongodb_uri }
110121 return [], opts
111122
123+ engine .dialect .create_connect_args = custom_create_connect_args
124+ return engine
125+ elif mongodb_uri .startswith ("mongodb+superset://" ):
126+ # For MongoDB+Superset, convert to standard mongodb:// for SQLAlchemy compatibility
127+ # but preserve the superset mode by passing it through connection options
128+ converted_uri = mongodb_uri .replace ("mongodb+superset://" , "mongodb://" )
129+
130+ # Create engine with converted URI
131+ engine = create_engine (converted_uri , ** engine_kwargs )
132+
133+ def custom_create_connect_args (url ):
134+ # Use original superset URI for actual MongoDB connection
135+ # This preserves the superset mode for subquery support
136+ opts = {"host" : mongodb_uri }
137+ return [], opts
138+
112139 engine .dialect .create_connect_args = custom_create_connect_args
113140 return engine
114141 else :
@@ -123,18 +150,18 @@ def register_dialect():
123150 """Register the PyMongoSQL dialect with SQLAlchemy.
124151
125152 This function handles registration for both SQLAlchemy 1.x and 2.x.
126- Registers support for standard MongoDB connection strings only .
153+ Registers support for standard, SRV, and superset MongoDB connection strings.
127154 """
128155 try :
129156 from sqlalchemy .dialects import registry
130157
131158 # Register for standard MongoDB URLs
132159 registry .register ("mongodb" , "pymongosql.sqlalchemy_mongodb.sqlalchemy_dialect" , "PyMongoSQLDialect" )
133160
134- # Try to register both SRV forms so SQLAlchemy can resolve SRV-style URLs
135- # (either 'mongodb+srv ' or the dotted 'mongodb.srv' plugin name ).
136- # Some SQLAlchemy versions accept '+' in scheme names; others import
137- # the dotted plugin name. Attempt both registrations in one block .
161+ # Try to register SRV and Superset forms so SQLAlchemy can resolve these URL patterns
162+ # (either with '+ ' or dotted notation for compatibility with different SQLAlchemy versions ).
163+ # Some SQLAlchemy versions accept '+' in scheme names; others import the dotted plugin name.
164+ # Attempt all registrations but don't fail if some are not supported .
138165 try :
139166 registry .register ("mongodb+srv" , "pymongosql.sqlalchemy_mongodb.sqlalchemy_dialect" , "PyMongoSQLDialect" )
140167 registry .register ("mongodb.srv" , "pymongosql.sqlalchemy_mongodb.sqlalchemy_dialect" , "PyMongoSQLDialect" )
@@ -143,6 +170,18 @@ def register_dialect():
143170 # create_engine_from_mongodb_uri by converting 'mongodb+srv' to 'mongodb'.
144171 pass
145172
173+ try :
174+ registry .register (
175+ "mongodb+superset" , "pymongosql.sqlalchemy_mongodb.sqlalchemy_dialect" , "PyMongoSQLDialect"
176+ )
177+ registry .register (
178+ "mongodb.superset" , "pymongosql.sqlalchemy_mongodb.sqlalchemy_dialect" , "PyMongoSQLDialect"
179+ )
180+ except Exception :
181+ # If registration fails we fall back to handling Superset URIs in
182+ # create_engine_from_mongodb_uri by converting 'mongodb+superset' to 'mongodb'.
183+ pass
184+
146185 return True
147186 except ImportError :
148187 # Fallback for versions without registry
0 commit comments