📅  最后修改于: 2023-12-03 15:08:48.388000             🧑  作者: Mango
在使用 SQLAlchemy ORM 的时候,已经有许多文档提供了详细的关于基本CRUD以及高级查询等操作的介绍。然而,当需要执行原生 SQL 时,我们就需要使用到 SQLAlcheny 核心部分的功能。
SQLAlchemy中包含一个engine对象,他是连接所需要的关键组件,也是执行SQL语句的入口。可以创建一个engine对象后直接使用 engine.execute()
方法来执行原始 SQL 语句。
需要注意的是在执行原生 SQL 时,不再使用 ORM,所以执行结果都是原始的 tuple 数据。
下面我们将介绍如下6种情况下如何使用 SQLAlchemy 执行原始 SQL 语句。
from sqlalchemy import create_engine
# 创建engine对象
engine = create_engine('mysql+pymysql://username:password@host/dbname')
conn = engine.connect()
# 执行查询语句
result = conn.execute('SELECT * FROM users')
for row in result:
print(row)
# 关闭连接
conn.close()
以上代码中使用了 pymysql 的驱动来连接 MySQL 数据库。使用 create_engine()
函数创建一个 engine 对象后,再使用 connect()
方法创建一个连接对象 conn。result
对象是一个游标,可以通过遍历其返回的数据来获取查询结果。
from sqlalchemy import create_engine
# 创建engine对象
engine = create_engine('mysql+pymysql://username:password@host/dbname')
conn = engine.connect()
# 插入数据
conn.execute("INSERT INTO users (name, age) VALUES ('John', 25)")
# 更新数据
conn.execute("UPDATE users SET age=26 WHERE name='John'")
# 删除数据
conn.execute("DELETE FROM users WHERE name='John'")
# 关闭连接
conn.close()
以上代码中,分别使用 execute()
方法执行了 INSERT / UPDATE / DELETE 语句。这里也不需要返回结果,只需要执行语句即可。
当需要执行多条语句时,可以将所有语句放在一个字符串中,用分号(;
)分隔开。
from sqlalchemy import create_engine
# 创建engine对象
engine = create_engine('mysql+pymysql://username:password@host/dbname')
conn = engine.connect()
# 执行多条语句
sql = """
INSERT INTO users (name, age) VALUES ('Alice', 23);
INSERT INTO users (name, age) VALUES ('Bob', 25);
INSERT INTO users (name, age) VALUES ('Charlie', 27);
"""
conn.execute(sql)
# 关闭连接
conn.close()
在执行 SQL 语句时,如果使用字符串拼接的方式传递参数,容易出现 SQL 注入等安全问题。为了避免这种情况,可以使用传入参数的方式。
from sqlalchemy import create_engine
# 创建engine对象
engine = create_engine('mysql+pymysql://username:password@host/dbname')
conn = engine.connect()
# 使用参数查询
name = 'John'
age = 25
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
conn.execute(sql, (name, age))
# 关闭连接
conn.close()
以上代码中,使用 %s
来表示需要传递参数的位置,然后再使用 execute()
方法的参数传递方式,将要传递的参数传递给 execute()
方法即可。
在数据库中,我们也可以定义存储过程或函数,但是这些对象都不会像表一样被自动化、抽象化为模型类。我们需要像执行原始 SQL 语句一样执行这些存储过程或函数。
from sqlalchemy import create_engine
# 创建engine对象
engine = create_engine('mysql+pymysql://username:password@host/dbname')
conn = engine.connect()
# 执行存储过程
sql = "CALL proc1(%s, %s);"
result = conn.execute(sql, (arg1, arg2))
# 返回结果
for row in result:
print(row)
# 关闭连接
conn.close()
对于连接对象 conn
,我们必须使用 close()
方法来手动关闭连接。当我们使用 with statement 后,当离开 with statement 的作用域时,Python 会自动帮我们调用 close()
方法。
from sqlalchemy import create_engine
# 创建engine对象
engine = create_engine('mysql+pymysql://username:password@host/dbname')
# 使用 with statement 控制连接
with engine.connect() as conn:
# 执行原始 SQL 语句
result = conn.execute('SELECT * FROM users')
# 返回结果
for row in result:
print(row)
以上代码中,我们通过使用 with statement 来控制连接,不需要手动调用 close()
方法。需要注意的是,在 with statement 作用域内,所有的操作都必须在该作用域内进行。否则将会触发错误。
本文介绍了 SQLAlcheny 中执行原始 SQL 语句的方法。开发者根据自身需求选择最适合自己的方法即可。