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”)
多看看文档

