【问题标题】:Database Connection Function for PythonPython的数据库连接函数
【发布时间】:2019-09-13 22:43:40
【问题描述】:

我编写了一个使用 pymysql 连接数据库的函数。这是我的代码:

def SQLreadrep(sql):
    connection=pymysql.connect(host=############,
                               user=#######,
                               password=########,
                               db=#########)
    with connection.cursor() as cursor:
            cursor.execute(sql)
            rows=cursor.fetchall()
    connection.commit()
    connection.close()
    return rows

我将 SQL 传递给这个函数并返回行。但是,我正在对数据库进行快速查询。 (类似于"SELECT sku WHERE object='2J4423K')。

  1. 有什么方法可以避免这么多连接?
  2. 我应该从一开始就避免这么多连接吗?
  3. 我可以使用这么多连接和查询使服务器崩溃吗?

【问题讨论】:

    标签: python database pymysql


    【解决方案1】:

    让我先回答你的最后一个问题。您的函数正在获取连接,但在返回之前将其关闭。所以,我看不出为什么除非你是多线程或多处理,否则你一次会使用多个连接并且你不应该让服务器崩溃。

    避免创建和关闭这么多连接的开销的方法是“缓存”连接。一种方法是用一个类替换你的函数:

    import pymysql
    
    class DB(object):
        def __init__(self, datasource, db_user, db_password):
            self.conn = pymysql.connect(db=datasource, user=db_user, password=db_password)
    
        def __del__(self):
            self.conn.close()
    
        def query(self, sql):
            with self.conn.cursor() as cursor:
                cursor.execute(sql)
                self.conn.commit()
                return cursor.fetchall()
    

    然后您实例化一个DB 类的实例并调用它的query 方法。当DB实例被抓取时,连接会自动关闭。

    【讨论】:

    • 谢谢!我担心连接的负载。
    • 另一种方法是从 Python 包索引 (PyPI) 安装 pymysql 连接池包,例如 pymysql-pooling。例如,如果您正在执行多线程并且确实需要多个同时连接,这将是一个很好的方法。
    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2013-10-03
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多