添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
# 执行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 中第三条的问题。
  •