# 执行SQL语句
sql_statement = "SELECT * FROM your_table"
result = engine.execute(sql_statement).fetchall()
# 关闭连接
engine.dispose()
engine.execute
方式每次执行时都会从连接池中获取一个连接,执行完毕后会将连接放回连接池中。
获取查询结果可以用:
-
fetchone():一条结果,元组形式。
-
fetchall():所有结果,列表元组形式。
-
scalar():查询字段只有一个的情况。直接返回该字段的值。
-
问题在于平行的执行多个sql,那么就需要多次engine.execute执行,意味着创建了多次连接,对mysql服务器是有负担的。本来只需要一个连接就可以执行多条平行sql了。
3、使用engine.connect()执行sql语句
from sqlalchemy import create_engine
# 创建MySQL连接引擎
engine = create_engine('mysql://username:password@host:port/database_name')
# 使用with语句执行SQL
with engine.connect() as connection:
# 执行SQL语句
sql_statement = "SELECT * FROM your_table"
result = connection.execute(sql_statement).fetchall()
# 连接在with语句块结束时自动关闭
engine.connect()
返回一个连接对象,然后在with
语句中,该连接对象会一直保持打开状态,直到代码块结束。一旦代码块结束,连接会自动关闭。
获取查询结果同上
用到了上下文管理器with,因此我们不用显示的将connection关闭。
这个查询方式就可以此with下执行多条sql语句,而且复用的一条连接。如此,就解决了 2
中第三条的问题。
事务版本(我未用过):
from sqlalchemy import create_engine
# 创建MySQL连接引擎
engine = create_engine('mysql://username:password@host:port/database_name')
# 使用with语句执行SQL并管理事务
with engine.connect() as connection:
# 开始事务
trans = connection.begin()
# 执行一些SQL语句
connection.execute("INSERT INTO your_table (column1, column2) VALUES (%s, %s)", (value1, value2))
connection.execute("UPDATE another_table SET column3 = %s WHERE column4 = %s", (value3, value4))
# 提交事务
trans.commit()
except:
# 发生异常时回滚事务
trans.rollback()
raise
也可以用with
- 在使用了
with
语句管理事务的情况下,事务的提交和回滚会由 with
语句自动处理。当 with
语句块正常结束时,会自动提交事务;而如果在 with
语句块中发生了异常,则会自动回滚事务。
4、使用engine.begin()执行sql语句
from sqlalchemy import create_engine
# 创建MySQL连接引擎
engine = create_engine('mysql://username:password@host:port/database_name')
# 使用with语句执行SQL
with engine.begin() as connection:
# 执行SQL语句
sql_statement = "SELECT * FROM your_table"
result = connection.execute(sql_statement).fetchall()
# 连接在with语句块结束时自动关闭
engine.begin()
会从连接池中获取一个连接,并使用这个连接开始一个新的数据库事务。
获取查询结果同上
用到了上下文管理器with,因此我们不用显示的将connection关闭。
在使用了 with
语句管理事务的情况下,事务的提交和回滚会由 with
语句自动处理。当 with
语句块正常结束时,会自动提交事务;而如果在 with
语句块中发生了异常,则会自动回滚事务。
这个查询方式就可以此with下执行多条sql语句,而且复用的一条连接。也解决了 2
中第三条的问题。