利用sqlalchemy engine对象执行sql的几种方式

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()
  1. engine.execute方式每次执行时都会从连接池中获取一个连接,执行完毕后会将连接放回连接池中。
  2. 获取查询结果可以用:
    • fetchone():一条结果,元组形式。
    • fetchall():所有结果,列表元组形式。
    • scalar():查询字段只有一个的情况。直接返回该字段的值。
  3. 问题在于平行的执行多个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语句块结束时自动关闭
  1. engine.connect()返回一个连接对象,然后在with语句中,该连接对象会一直保持打开状态,直到代码块结束。一旦代码块结束,连接会自动关闭。
  2. 获取查询结果同上
  3. 用到了上下文管理器with,因此我们不用显示的将connection关闭。
  4. 这个查询方式就可以此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语句块结束时自动关闭
  1. engine.begin()会从连接池中获取一个连接,并使用这个连接开始一个新的数据库事务。
  2. 获取查询结果同上
  3. 用到了上下文管理器with,因此我们不用显示的将connection关闭。
  4. 在使用了 with 语句管理事务的情况下,事务的提交和回滚会由 with 语句自动处理。当 with 语句块正常结束时,会自动提交事务;而如果在 with 语句块中发生了异常,则会自动回滚事务。
  5. 这个查询方式就可以此with下执行多条sql语句,而且复用的一条连接。也解决了 2 中第三条的问题。

发表评论

评论列表,共 0 条评论

    暂无评论