Python中如何混合使用ORM和SQL原生语句?

比如在使用 sqlalchemy 的时候,想要用一下 sql 语句,是不是还得先使用 pymysql.connect()进行连接等等操作

第二个是在创建表的时候是优先使用 orm 还是 sql 语句


Python中如何混合使用ORM和SQL原生语句?
3 回复

在同一个项目里混用ORM和SQL原生语句很常见,通常用SQLAlchemy的session.execute()或Django的connection.cursor()。关键是要处理好参数传递和结果映射。

以SQLAlchemy为例,假设你有个User模型,但需要执行复杂报表查询:

from sqlalchemy import text
from your_app import Session

def get_user_report(start_date):
    session = Session()
    
    # ORM查询部分
    recent_users = session.query(User).filter(User.created_at >= start_date).all()
    
    # 原生SQL部分 - 使用text()包装和命名参数
    sql = text("""
        SELECT department, COUNT(*) as user_count, AVG(age) as avg_age
        FROM users 
        WHERE created_at >= :start_date
        GROUP BY department
    """)
    
    # 执行原生SQL,参数安全传递
    result = session.execute(sql, {"start_date": start_date})
    
    # 将结果转换为字典列表以便使用
    report_data = [dict(row._mapping) for row in result]
    
    return {
        "recent_users": recent_users,  # ORM对象列表
        "report": report_data          # 字典列表
    }

Django的做法类似,用connection.cursor()

from django.db import connection
from myapp.models import User

def get_user_data(start_date):
    # ORM部分
    users = User.objects.filter(created_at__gte=start_date)
    
    # 原生SQL部分
    with connection.cursor() as cursor:
        cursor.execute("""
            SELECT status, COUNT(*) 
            FROM myapp_user 
            WHERE created_at >= %s
            GROUP BY status
        """, [start_date])
        
        # 获取结果
        rows = cursor.fetchall()
    
    return {"users": users, "stats": rows}

混用的要点:1) 用ORM处理简单CRUD和关系操作;2) 复杂查询、报表或性能关键处用原生SQL;3) 始终使用参数化查询防止SQL注入;4) 注意事务一致性,确保ORM和SQL操作在同一个事务里。

简单说就是:该用ORM的地方用ORM,该写SQL的时候就写SQL,别硬用一种方式。


session.execute(“sql”)
多看看文档

回到顶部