【Python】深入掌握SQLAlchemy:原生SQL语句执行的艺术与技巧
我就站在布拉格黄昏的广场
在许愿池投下了希望
那群白鸽背对着夕阳
那画面太美我不敢看
布拉格的广场无人的走廊
我一个人跳着舞旋转
不远地方你远远吟唱
没有我你真的不习惯
🎵 蔡依林/周杰伦《布拉格广场》
简介:
欢迎进入 SQLAlchemy 的世界,一个强大的 Python SQL 工具包和对象关系映射(ORM)系统。在本篇博客中,我们将深入探讨如何在 SQLAlchemy 中执行原生 SQL 语句,无论是出于性能考虑还是为了执行复杂的查询和操作,直接使用 SQL 语句有时是必须的。我们将一步一步地了解如何利用 SQLAlchemy 来执行原生 SQL,让你能够更加灵活地与你的数据库进行交互。
引入 SQLAlchemy
首先,确保你已经安装了 SQLAlchemy,并且理解了基础概念如引擎(Engine)、会话(Session)等。如果还没有,可以通过简单的 pip 命令来安装它:
pip install SQLAlchemy
创建引擎(Engine)
SQLAlchemy 通过 Engine 管理与数据库的连接信息。创建一个 Engine 很简单:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///example.db') # 替换为你的数据库 URL
执行原生 SQL 查询
使用 Connection 对象
创建 Engine 后,使用 connect() 方法获取一个连接(Connection)对象,它提供了 execute() 方法来运行 SQL 语句:
python
Copy code
from sqlalchemy import text
with engine.connect() as connection:
result = connection.execute(text("SELECT * FROM users WHERE id=:user_id"), {"user_id": 1})
for row in result:
print(row)
在这个例子中,我们使用 text() 函数构造了一个安全的 SQL 语句,并通过字典传递了参数。
事务管理
SQLAlchemy 通过连接(Connection)上下文自动管理事务。在 with 块结束时,如果没有错误发生,事务将自动提交;如果发生异常,事务将回滚。
使用 Session 对象
如果你已经在使用 ORM 功能,可能已经有了一个会话(Session)对象。你也可以通过 Session 来执行原生 SQL:
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
result = session.execute(text("SELECT * FROM users WHERE id=:user_id"), {"user_id": 1})
for row in result:
print(row)
session.close()
执行插入、更新和删除
执行非查询语句也很类似:
with engine.connect() as connection:
connection.execute(text("UPDATE users SET name=:name WHERE id=:user_id"), {"name": "Alice", "user_id": 1})
connection.execute(text("DELETE FROM users WHERE id=:user_id"), {"user_id": 1})
请记得对于插入操作,使用 text() 与参数字典来防止 SQL 注入攻击。
总结
通过上述方法,你可以在 SQLAlchemy 中灵活地执行任何原生 SQL 语句。无论是查询、插入、更新还是删除操作,SQLAlchemy 都为你提供了一种安全且有效的方式来直接与数据库交流。
作者:音乐学家方大刚