杰瑞科技汇

Python MySQL model 如何高效操作数据库?

Of course! Building a Python model for MySQL is a fundamental task in web development and data engineering. The term "model" can mean a few things, so I'll cover the most common and important interpretations:

Python MySQL model 如何高效操作数据库?-图1
(图片来源网络,侵删)
  1. Data Model (ORM - Object-Relational Mapping): This is the most popular approach. You define Python classes that map directly to your database tables. This allows you to interact with your database using Python objects and methods, instead of writing raw SQL queries. It's more intuitive, less error-prone, and helps keep your code organized.
  2. Machine Learning Model: This involves using data stored in MySQL to train a predictive model (e.g., for classification, regression). We'll touch on this briefly as well.

The Recommended Approach: Using an ORM (SQLAlchemy)

SQLAlchemy is the de-facto standard for database interaction in Python. It provides a powerful and flexible Object-Relational Mapper (ORM).

Step 1: Install Necessary Libraries

You'll need SQLAlchemy for the ORM and a MySQL driver. mysqlclient is a common and performant choice.

pip install SQLAlchemy mysqlclient
  • SQLAlchemy: The core ORM toolkit.
  • mysqlclient: A low-level driver that SQLAlchemy uses to communicate with the MySQL server. (You might also see PyMySQL used, which is also a good option).

Step 2: Define Your Database Schema (The Model)

Let's create a simple users table in MySQL. We'll then define a corresponding Python User model.

First, let's set up the table in MySQL (you can use a client like DBeaver, TablePlus, or the command line):

Python MySQL model 如何高效操作数据库?-图2
(图片来源网络,侵删)
-- Create a database (optional, but good practice)
CREATE DATABASE myapp_db;
-- Use the database
USE myapp_db;
-- Create a users table
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    full_name VARCHAR(100),
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Now, let's create the Python model that maps to this table.

models.py

from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime
# 1. Setup Database Connection
# Replace with your actual MySQL connection details
# Format: mysql+mysqlclient://user:password@host:port/database
DATABASE_URL = "mysql+mysqlclient://root:my-secret-pw@localhost/myapp_db"
# Create the engine, which is the interface to the database
engine = create_engine(DATABASE_URL)
# 2. Create a Base class for our models
Base = declarative_base()
# 3. Define the User Model (Python class that maps to the 'users' table)
class User(Base):
    __tablename__ = 'users'  # The name of the table in the database
    # Define columns and their properties
    id = Column(Integer, primary_key=True)
    username = Column(String(50), unique=True, nullable=False)
    email = Column(String(100), unique=True, nullable=False)
    full_name = Column(String(100))
    is_active = Column(Boolean, default=True)
    created_at = Column(DateTime, default=datetime.utcnow)
    # (Optional) A helpful string representation for the object
    def __repr__(self):
        return f"<User(username='{self.username}', email='{self.email}')>"
# 4. Create the table in the database (if it doesn't exist)
# This is useful for development. In production, you'd use migrations (e.g., Alembic).
Base.metadata.create_all(bind=engine)
# 5. Create a Session class to manage conversations with the database
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Step 3: Interact with the Model (CRUD Operations)

Now you can use your User model to create, read, update, and delete records without writing a single line of SQL.

main.py

Python MySQL model 如何高效操作数据库?-图3
(图片来源网络,侵删)
from models import User, SessionLocal
# --- Create a new user ---
def create_user(username, email, full_name=None):
    db = SessionLocal()
    try:
        # 1. Create a new User object
        new_user = User(username=username, email=email, full_name=full_name)
        # 2. Add the object to the session
        db.add(new_user)
        # 3. Commit the session to save the object to the database
        db.commit()
        # 4. Refresh the object to get the newly generated ID and other defaults
        db.refresh(new_user)
        print(f"Successfully created user: {new_user}")
        return new_user
    except Exception as e:
        db.rollback() # Rollback in case of error
        print(f"Error creating user: {e}")
    finally:
        db.close() # Always close the session
# --- Read users ---
def get_user_by_id(user_id):
    db = SessionLocal()
    try:
        # Query the database for a user by primary key
        user = db.query(User).filter(User.id == user_id).first()
        if user:
            print(f"Found user: {user}")
            return user
        else:
            print(f"User with id {user_id} not found.")
            return None
    finally:
        db.close()
def get_all_active_users():
    db = SessionLocal()
    try:
        # Query all active users
        users = db.query(User).filter(User.is_active == True).all()
        print(f"Found {len(users)} active users:")
        for user in users:
            print(f"- {user}")
        return users
    finally:
        db.close()
# --- Update a user ---
def update_user_email(user_id, new_email):
    db = SessionLocal()
    try:
        # 1. Fetch the user
        user = db.query(User).filter(User.id == user_id).first()
        if user:
            # 2. Modify the attribute
            user.email = new_email
            # 3. Commit the session (SQLAlchemy will generate an UPDATE statement)
            db.commit()
            print(f"Successfully updated user {user_id}'s email to {new_email}")
        else:
            print(f"User with id {user_id} not found for update.")
    except Exception as e:
        db.rollback()
        print(f"Error updating user: {e}")
    finally:
        db.close()
# --- Delete a user ---
def delete_user(user_id):
    db = SessionLocal()
    try:
        # 1. Fetch the user
        user = db.query(User).filter(User.id == user_id).first()
        if user:
            # 2. Delete the object from the session
            db.delete(user)
            # 3. Commit the session (SQLAlchemy will generate a DELETE statement)
            db.commit()
            print(f"Successfully deleted user {user_id}")
        else:
            print(f"User with id {user_id} not found for deletion.")
    except Exception as e:
        db.rollback()
        print(f"Error deleting user: {e}")
    finally:
        db.close()
# --- Main execution block ---
if __name__ == "__main__":
    # Create some users
    create_user("johndoe", "john.doe@example.com", "John Doe")
    create_user("janedoe", "jane.doe@example.com", "Jane Doe")
    # Read them back
    get_all_active_users()
    # Get a specific user by ID (assuming the first user has ID 1)
    # Note: IDs are auto-incremented, so this might not always be 1.
    # It's better to get the ID from the `create_user` return value.
    first_user = get_user_by_id(1) 
    if first_user:
        # Update that user
        update_user_email(1, "john.d.new@example.com")
        # Verify the update
        get_user_by_id(1)
        # Delete the user
        # delete_user(1)
        # Verify deletion
        # get_all_active_users()

Alternative: Raw SQL with mysqlclient

If you prefer to write raw SQL or need maximum performance for specific queries, you can use mysqlclient directly. This gives you no ORM benefits but is very direct.

import MySQLdb
# Connect to the database
conn = MySQLdb.connect(
    host="localhost",
    user="root",
    passwd="my-secret-pw",
    db="myapp_db"
)
# Get a cursor object to execute queries
cursor = conn.cursor()
# --- CREATE ---
try:
    cursor.execute("INSERT INTO users (username, email, full_name) VALUES (%s, %s, %s)", 
                   ("charlie", "charlie@example.com", "Charlie Brown"))
    conn.commit() # Commit the transaction
    print("User Charlie created successfully!")
except MySQLdb.Error as e:
    conn.rollback()
    print(f"Error: {e}")
# --- READ ---
cursor.execute("SELECT id, username, email FROM users WHERE is_active = %s", (True,))
users = cursor.fetchall() # Fetch all rows
print("\n--- Active Users (Raw SQL) ---")
for user in users:
    print(f"ID: {user[0]}, Username: {user[1]}, Email: {user[2]}")
# --- UPDATE ---
try:
    cursor.execute("UPDATE users SET email = %s WHERE username = %s", 
                   ("charlie.brown@example.com", "charlie"))
    conn.commit()
    print("\nCharlie's email updated.")
except MySQLdb.Error as e:
    conn.rollback()
    print(f"Error: {e}")
# --- DELETE ---
# Be very careful with DELETE!
# try:
#     cursor.execute("DELETE FROM users WHERE username = %s", ("charlie",))
#     conn.commit()
#     print("Charlie deleted.")
# except MySQLdb.Error as e:
#     conn.rollback()
#     print(f"Error: {e}")
# Close the cursor and connection
cursor.close()
conn.close()

Key Differences:

  • SQLAlchemy (ORM): Pythonic, less error-prone (prevents SQL injection), handles relationships, abstracts database differences.
  • Raw SQL: More direct control, can be faster for very complex queries, no ORM overhead.

Machine Learning Model using Data from MySQL

This is a different kind of "model." Here, you use the data from your MySQL database as a training set for a machine learning model (e.g., with scikit-learn).

import pandas as pd
import MySQLdb
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 1. Load data from MySQL into a Pandas DataFrame
conn = MySQLdb.connect(
    host="localhost",
    user="root",
    passwd="my-secret-pw",
    db="myapp_db"
)
# Use pandas to read the SQL query directly into a DataFrame
query = "SELECT id, username, is_active FROM users"
df = pd.read_sql(query, conn)
print("Data from MySQL:")
print(df.head())
# 2. Prepare data for the ML model
# Let's pretend we want to predict if a user is active based on their ID (a silly example)
# In a real scenario, you'd have more meaningful features.
X = df[['id']] # Feature
y = df['is_active'] # Target
# 3. Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 4. Create and train the ML model
model = LogisticRegression()
model.fit(X_train, y_train)
# 5. Make predictions and evaluate
predictions = model.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
print(f"\nML Model Accuracy: {accuracy * 100:.2f}%")
# Close the connection
conn.close()

Summary and Best Practices

Method Pros Cons Best For
SQLAlchemy ORM - Pythonic, readable code
- Prevents SQL injection
- Handles database schema changes
- Manages relationships easily
- Has a learning curve
- Slight performance overhead
Most applications, especially those with complex data models and business logic.
Raw SQL (mysqlclient) - Maximum performance for complex queries
- Full control over SQL
- Prone to SQL injection if not careful
- Verbose and less maintainable
- No abstraction
Simple scripts, performance-critical parts of an application, or when you need to use a specific SQL feature not supported by the ORM.
ML Model - Leverages existing data for prediction - Requires a separate data science workflow Building predictive features, recommendation systems, anomaly detection, etc.

For almost all general-purpose applications, starting with SQLAlchemy (an ORM) is the recommended best practice. It provides a robust, secure, and maintainable way to interact with your MySQL database from Python.

分享:
扫描分享到社交APP
上一篇
下一篇