📜  如何在 SQLAlchemy 中执行原始 SQL(1)

📅  最后修改于: 2023-12-03 15:08:48.388000             🧑  作者: Mango

如何在 SQLAlchemy 中执行原始 SQL

在使用 SQLAlchemy ORM 的时候,已经有许多文档提供了详细的关于基本CRUD以及高级查询等操作的介绍。然而,当需要执行原生 SQL 时,我们就需要使用到 SQLAlcheny 核心部分的功能。

SQLAlchemy中包含一个engine对象,他是连接所需要的关键组件,也是执行SQL语句的入口。可以创建一个engine对象后直接使用 engine.execute() 方法来执行原始 SQL 语句。

需要注意的是在执行原生 SQL 时,不再使用 ORM,所以执行结果都是原始的 tuple 数据。

下面我们将介绍如下6种情况下如何使用 SQLAlchemy 执行原始 SQL 语句。

1. 执行查询语句
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 对象是一个游标,可以通过遍历其返回的数据来获取查询结果。

2. 执行INSERT / UPDATE / DELETE 语句
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 语句。这里也不需要返回结果,只需要执行语句即可。

3. 执行多条语句

当需要执行多条语句时,可以将所有语句放在一个字符串中,用分号(;)分隔开。

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()
4. 使用参数查询

在执行 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() 方法即可。

5. 执行原生存储过程或函数

在数据库中,我们也可以定义存储过程或函数,但是这些对象都不会像表一样被自动化、抽象化为模型类。我们需要像执行原始 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()
6. 使用 with statement 控制连接

对于连接对象 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 语句的方法。开发者根据自身需求选择最适合自己的方法即可。