【问题标题】:Close SQLAlchemy connection关闭 SQLAlchemy 连接
【发布时间】:2014-08-27 23:19:52
【问题描述】:

我在python中有如下函数:

def add_odm_object(obj, table_name, primary_key, unique_column):
    db = create_engine('mysql+pymysql://root:@127.0.0.1/mydb')
    metadata = MetaData(db)
    t = Table(table_name, metadata, autoload=True)
    s = t.select(t.c[unique_column] == obj[unique_column])    
    rs = s.execute()
    r = rs.fetchone()
    if not r:
        i = t.insert()
        i_res = i.execute(obj)
        v_id = i_res.inserted_primary_key[0]
        return v_id
    else:
        return r[primary_key]   

该函数查看对象obj是否在数据库中,如果没有找到,则将其保存到数据库中。现在,我有一个问题。我多次循环调用上述函数。几百次后,我收到一个错误:user root has exceeded the max_user_connections resource (current value: 30) 我试图搜索答案,例如问题:How to close sqlalchemy connection in MySQL 建议创建一个conn = db.connect() 对象,其中db 是引擎并在我之后调用conn.close()查询完成。

但是,我应该在哪里打开和关闭我的代码中的连接?我没有直接使用连接,但我在代码中使用了Table()MetaData 函数。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    该引擎是用于数据库连接的创建成本高昂的factory。您的应用程序应该调用create_engine()每个数据库服务器只调用一次

    同样,MetaDataTable 对象描述了已知数据库中的固定模式对象。这些也是配置结构,在大多数情况下,就像类一样,在模块中创建一次。

    在这种情况下,您的函数似乎想要动态加载表,这很好; MetaData 对象充当registry,它具有方便的功能,如果现有表已经存在,它将返回给您。

    在 Python 函数中,尤其是在循环中,为了获得最佳性能,您通常只想引用单个数据库连接

    考虑到这些因素,您的模块可能如下所示:

    # module level variable.  can be initialized later, 
    # but generally just want to create this once.
    db = create_engine('mysql+pymysql://root:@127.0.0.1/mydb')
    
    # module level MetaData collection.
    metadata = MetaData()
    
    def add_odm_object(obj, table_name, primary_key, unique_column):
        with db.begin() as connection:
    
            # will load table_name exactly once, then store it persistently
            # within the above MetaData
            t = Table(table_name, metadata, autoload=True, autoload_with=conn)
    
            s = t.select(t.c[unique_column] == obj[unique_column])    
            rs = connection.execute(s)
            r = rs.fetchone()
            if not r:
                i_res = connection.execute(t.insert(), some_col=obj)
                v_id = i_res.inserted_primary_key[0]
                return v_id
            else:
                return r[primary_key]   
    

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 2019-12-28
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2021-09-03
      相关资源
      最近更新 更多