PyMongoSQL is a Python DB API 2.0 (PEP 249) client for MongoDB. It provides a familiar SQL interface to MongoDB, allowing developers to use SQL to interact with MongoDB collections.
PyMongoSQL implements the DB API 2.0 interfaces to provide SQL-like access to MongoDB. The project aims to:
- Bridge the gap between SQL and NoSQL by providing SQL capabilities for MongoDB
- Support standard SQL DQL (Data Query Language) operations including SELECT statements with WHERE, ORDER BY, and LIMIT clauses
- Provide seamless integration with existing Python applications that expect DB API 2.0 compliance
- Enable easy migration from traditional SQL databases to MongoDB
- DB API 2.0 Compliant: Full compatibility with Python Database API 2.0 specification
- SQLAlchemy Integration: Complete ORM and Core support with dedicated MongoDB dialect
- SQL Query Support: SELECT statements with WHERE conditions, field selection, and aliases
- Connection String Support: MongoDB URI format for easy configuration
- Python: 3.9, 3.10, 3.11, 3.12, 3.13+
- MongoDB: 7.0+
-
PyMongo (MongoDB Python Driver)
- pymongo >= 4.15.0
-
ANTLR4 (SQL Parser Runtime)
- antlr4-python3-runtime >= 4.13.0
- SQLAlchemy (for ORM/Core support)
- sqlalchemy >= 1.4.0 (SQLAlchemy 1.4+ and 2.0+ supported)
pip install pymongosqlOr install from source:
git clone https://github.com/your-username/PyMongoSQL.git
cd PyMongoSQL
pip install -e .from pymongosql import connect
# Connect to MongoDB
connection = connect(
host="mongodb://localhost:27017",
database="database"
)
cursor = connection.cursor()
cursor.execute('SELECT name, email FROM users WHERE age > 25')
print(cursor.fetchall())from pymongosql import connect
# Connect with authentication
connection = connect(
host="mongodb://username:password@localhost:27017/database?authSource=admin"
)
cursor = connection.cursor()
cursor.execute('SELECT * FROM products WHERE category = ?', ['Electronics'])
for row in cursor:
print(row)from pymongosql import connect
with connect(host="mongodb://localhost:27017/database") as conn:
with conn.cursor() as cursor:
cursor.execute('SELECT COUNT(*) as total FROM users')
result = cursor.fetchone()
print(f"Total users: {result['total']}")from pymongosql import connect
connection = connect(host="mongodb://localhost:27017/database")
cursor = connection.cursor()
# Parameterized queries for security
min_age = 18
status = 'active'
cursor.execute('''
SELECT name, email, created_at
FROM users
WHERE age >= ? AND status = ?
''', [min_age, status])
users = cursor.fetchmany(5) # Fetch first 5 results
while users:
for user in users:
print(f"User: {user['name']} ({user['email']})")
users = cursor.fetchmany(5) # Fetch next 5- Field selection:
SELECT name, age FROM users - Wildcards:
SELECT * FROM products
- Equality:
WHERE name = 'John' - Comparisons:
WHERE age > 25,WHERE price <= 100.0 - Logical operators:
WHERE age > 18 AND status = 'active'
- ORDER BY:
ORDER BY name ASC, age DESC - LIMIT:
LIMIT 10 - Combined:
ORDER BY created_at DESC LIMIT 5
from pymongosql.connection import Connection
# Basic connection
conn = Connection(host="localhost", port=27017, database="mydb")
# With authentication
conn = Connection(
host="mongodb://user:pass@host:port/db?authSource=admin",
database="mydb"
)
# Connection properties
print(conn.host) # MongoDB connection URL
print(conn.port) # Port number
print(conn.database_name) # Database name
print(conn.is_connected) # Connection statusContributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
PyMongoSQL is distributed under the MIT license.