Of course! This is a very common point of confusion for developers moving to Python 3. Here’s a detailed breakdown of the history, the current state, and the recommended solutions.

The Short Answer (TL;DR)
For Python 3, the package you should use is mysql-connector-python.
mysql-python(also known asMySQLdb) is the old library for Python 2. It does not work with Python 3.- The official, recommended, and actively maintained library from Oracle is
mysql-connector-python. It's pure Python, easy to install withpip, and works seamlessly with Python 3.
The Detailed Explanation: The History of MySQL Connectors for Python
To understand why there are multiple options, let's look at the timeline.
The Old Days: MySQLdb (The mysql-python package)
- Era: Primarily for Python 2.
- What it was: A C extension that wrapped the native MySQL C client library (
libmysqlclient). This made it very fast. - The Problem: It was difficult to install because you needed a C compiler and the MySQL development headers (
libmysqlclient-devormysql-devel) on your system. This was a major hurdle for beginners and on platforms like Windows. - The Name: The package on PyPI was named
mysql-python, which is confusing. The actual module name you imported wasMySQLdb. - Status: Deprecated and incompatible with Python 3. You should avoid this entirely for new projects.
The Gap: mysqlclient
- Era: The bridge between Python 2 and 3.
- What it is: A drop-in replacement for
MySQLdbthat is compatible with Python 3. It's a fork of the originalMySQLdband is also a C extension. - Pros: If you have old code that uses
import MySQLdb, you can often just switch tomysqlclientwith minimal changes. It's very fast, just like its predecessor. - Cons: It has the same installation difficulty as
MySQLdb. You still need a C compiler and the MySQL development headers. This makes it less portable. - Status: Actively maintained, but installation friction makes it less ideal for most modern projects unless you need maximum performance and have control over the deployment environment.
The Modern Solution: mysql-connector-python
- Era: The official, modern choice for both Python 2 and 3.
- What it is: A pure Python implementation written by Oracle. It does not require the MySQL C client library to be installed on the system.
- Pros:
- Extremely easy to install:
pip install mysql-connector-python - Officially supported by Oracle.
- Works out-of-the-box on all platforms (Windows, macOS, Linux) without compilers.
- Actively developed and updated.
- Extremely easy to install:
- Cons:
- Being pure Python, it can be slightly slower than the C-based
mysqlclient. For most web applications and scripts, this performance difference is completely negligible.
- Being pure Python, it can be slightly slower than the C-based
Comparison Table
| Feature | mysql-connector-python (Recommended) |
mysqlclient (Alternative) |
MySQLdb / mysql-python (Legacy) |
|---|---|---|---|
| Python Version | Python 2 & 3 | Python 2 & 3 | Python 2 only |
| Language | Pure Python | C Extension | C Extension |
| Installation | pip install mysql-connector-python (Very Easy) |
pip install mysqlclient (Requires compiler & headers) |
pip install mysql-python (Requires compiler & headers) |
| Performance | Good (slower than C) | Excellent (Fastest) | Excellent (Fastest) |
| Status | Official & Recommended | Good for legacy code | Deprecated & Broken for Py3 |
| Best For | Almost all new projects. | Projects needing max performance where you control the build environment. | Old Python 2 projects (should not be used). |
How to Use mysql-connector-python (Python 3 Example)
Here is a simple, complete example of how to connect to a MySQL database and execute a query.
Installation
First, install the library from your terminal or command prompt:

pip install mysql-connector-python
Python Code
import mysql.connector
from mysql.connector import Error
def create_connection(host_name, user_name, user_password, db_name=None):
"""Creates a database connection to a MySQL server."""
connection = None
try:
# If db_name is provided, connect to that specific database.
# Otherwise, connect to the server without selecting a database.
if db_name:
connection = mysql.connector.connect(
host=host_name,
user=user_name,
passwd=user_password,
database=db_name
)
else:
connection = mysql.connector.connect(
host=host_name,
user=user_name,
passwd=user_password
)
print("Connection to MySQL successful" if db_name else "Connection to MySQL server successful")
return connection
except Error as e:
print(f"The error '{e}' occurred")
return None
def execute_query(connection, query, data=None):
"""Executes a single query."""
cursor = connection.cursor()
try:
if data:
# Use '%s' as the placeholder, even with numbers
cursor.execute(query, data)
else:
cursor.execute(query)
connection.commit()
print("Query executed successfully")
except Error as e:
print(f"The error '{e}' occurred")
def fetch_query_results(connection, query):
"""Executes a query and fetches all results."""
cursor = connection.cursor(dictionary=True) # dictionary=True gives rows as dicts
try:
cursor.execute(query)
result = cursor.fetchall()
return result
except Error as e:
print(f"The error '{e}' occurred")
return None
# --- Main execution ---
if __name__ == "__main__":
# Replace with your own database credentials
db_host = "localhost"
db_user = "your_username"
db_password = "your_password"
database_name = "your_database" # Optional, for connecting directly to a DB
# --- Example 1: Connect to a specific database and create a table ---
connection = create_connection(db_host, db_user, db_password, database_name)
if connection:
create_table_query = """
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
registration_date DATE
)
"""
execute_query(connection, create_table_query)
# --- Example 2: Insert data into the table ---
insert_user_query = "INSERT INTO users (name, email, registration_date) VALUES (%s, %s, %s)"
user_data = ("John Doe", "john.doe@example.com", "2025-10-27")
execute_query(connection, insert_user_query, user_data)
# --- Example 3: Fetch and display data ---
select_users_query = "SELECT * FROM users"
users = fetch_query_results(connection, select_users_query)
if users:
print("\nUsers in the database:")
for user in users:
print(user)
# --- Don't forget to close the connection ---
connection.close()
print("\nMySQL connection is closed.")
Other Modern Alternatives
While mysql-connector-python is the official choice, other excellent libraries exist, especially for web frameworks like Django.
PyMySQL: Another popular pure-Python library. It's very similar tomysql-connector-pythonin terms of ease of use. Some developers prefer it.- Django's
mysqlclient: The Django framework officially recommendsmysqlclientfor its best performance with its ORM. However, it provides fallback instructions formysql-connector-pythonorPyMySQLif installation is a problem.
Conclusion: For any new Python 3 project, start with mysql-connector-python. It's the official, most straightforward, and hassle-free option.
