本文共 3060 字,大约阅读时间需要 10 分钟。
SQLAlchemy 是一款功能强大的 ORM 工具,它主要通过 Session 对象进行数据库操作。如果您需要使用原生 SQL 语句进行操作,需要使用 Engine 和 Connection 对象。以下将介绍如何使用 SQLAlchemy 进行原生 SQL 操作,具体以 SQLite 数据库为例。
创建 Engine 对象
使用create_engine()
函数创建 Engine 对象,指定数据库 URL。例如,用于 SQLite 数据库的 URL 格式为 sqlite:///数据库名称
。获取 Connection 对象
通过Engine.connect()
方法获取 Connection 对象,Connection 对象支持原生 SQL 语句的执行。执行 SQL 语句
Connection 对象的execute()
方法用于执行 SQL 语句,返回 ResultProxy 对象。ResultProxy
提供多种方法(如 fetchone()
和 fetchall()
)来处理查询结果。关闭资源
在操作完成后,使用Connection.close()
方法释放资源。from sqlalchemy import create_engineengine = create_engine('sqlite:///testdb.db')def test_select_statement(): with engine.connect() as conn: result_proxy = conn.execute("SELECT * FROM employees") result = result_proxy.fetchall() for item in result: print(item)
SQLAlchemy 支持两种参数格式:问号 (?
) 和命名参数 (:number
)。分别如下:
?
是常见的参数格式。例如:def test_parameter_method1(): with engine.connect() as conn: conn.execute( "INSERT INTO employees (EMP_ID, FIRST_NAME, LAST_NAME, GENDER, AGE, EMAIL, PHONE_NR, EDUCATION, MARITAL_STAT, NR_OF_CHILDREN) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);", ('9002', 'Stone2', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0) )
:1, :2, :3
等格式指定参数。例如:def test_parameter_method2(): with engine.connect() as conn: conn.execute( "INSERT INTO employees (EMP_ID, FIRST_NAME, LAST_NAME, GENDER, AGE, EMAIL, PHONE_NR, EDUCATION, MARITAL_STAT, NR_OF_CHILDREN) VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10);", ('9003', 'Stone3', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0) )
SQLAlchemy 支持一次插入多行数据,数据存储在一个列表中。例如:
def test_insert_multiple_rows(): with engine.connect() as conn: values = [ ('9004', 'Stone4', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0), ('9005', 'Stone5', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0), ('9006', 'Stone6', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0) ] conn.execute( "INSERT INTO employees (EMP_ID, FIRST_NAME, LAST_NAME, GENDER, AGE, EMAIL, PHONE_NR, EDUCATION, MARITAL_STAT, NR_OF_CHILDREN) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);", values )
SQLAlchemy 提供事务操作,支持 commit 和 rollback。每次操作开始时,使用 begin()
方法启动事务,操作完成后手动 commit 或 rollback。例如:
def test_txn(): conn = engine.connect() with conn.begin() as txn: conn.execute( "INSERT INTO employees (EMP_ID, FIRST_NAME, LAST_NAME, GENDER, AGE, EMAIL, PHONE_NR, EDUCATION, MARITAL_STAT, NR_OF_CHILDREN) VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10);", ('9007', 'Stone7', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0) ) txn.commit() conn.close()
通过以上方法,开发者可以利用 SQLAlchemy 的 Engine、Connection 以及原生 SQL 语句灵活操作数据库。无论是简单的数据查询,还是复杂的数据插入操作,使用原生 SQL 都提供了强大的灵活性。
转载地址:http://wjthz.baihongyu.com/