1、engine对象
# 创建数据库引擎
engine = create_engine('sqlite:///example.db')
engine是一个连接池。
- 关闭连接池:
engine.dispose()
2、使用engine.execute直接执行sql语句
from sqlalchemy import create_engine
# 创建MySQL连接引擎
engine = create_engine('mysql://username:password@host:port/database_name')
# 执行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()
try:
# 执行一些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
中第三条的问题。
评论列表,共 0 条评论
暂无评论