一个类中的python和mysql连接,DB打开和关闭奇怪的行为

时间:2015-12-15 11:36:40

标签: python mysql magento

我写了一个小应用程序,它使用mysql来获取需要在我们的magento网站上更新的产品列表。

然后,Python会对这些更新进行操作,并将数据库中的产品标记为完成。

我的原始代码(伪显示概述)

class Mysqltools:
    def get_products():
       db = pymysql.connect(host= .... )
       mysqlcursor = db.cursor(pymysql.cursors.DictCursor)
       sql = select * from x where y = z
       mysqlcursor.execute(sql % (z))
       rows = mysqlcursor.fetchall()
       mysqlcursor.close()
       db.close
       return rows

    def write_products(sku, name, id):
       db = pymysql.connect(host= .... )
       mysqlcursor = db.cursor(pymysql.cursors.DictCursor)
       sql = update table set sku = sku, name = name, id = id.....
       mysqlcursor.execute(sql % (sku, name, id))
       mysqlcursor.close()
       db.close

这工作正常,但在每个数据库连接字符串上我们都暂停了。

我做了一些研究并做了以下事情:

class Mysqltools:
    def __init__():
        self.db = pymysql.connect(host= .... )

    def get_products():

       mysqlcursor = self.db.cursor(pymysql.cursors.DictCursor)
       sql = select * from x where y = z
       mysqlcursor.execute(sql % (z))
       rows = mysqlcursor.fetchall()
       mysqlcursor.close()

    def write_products(sku, name, id):
       mysqlcursor = self.db.cursor(pymysql.cursors.DictCursor)
       sql = update table set sku = sku, name = name, id = id.....
       mysqlcursor.execute(sql % (sku, name, id))
       mysqlcursor.close()
       db.commit()

这有很大的速度提升。但是,它只会在第一次迭代时执行成功的get_products,一旦它被第二次调用,它就会找到0个要更新的产品,即使在db上执行相同的SQL会显示返回的行数。

我在连接上做错了吗? 我也试过在类之外移动db =并引用它但是仍然会出现同样的问题。

更新

进行一些测试,如果我从光标中删除DictCursor,我每次都可以返回正确的行(我刚刚创建了一个快速循环来继续检查记录)

DictCursor正在做一些我不知道的事情吗?

**更新2 **

我已经删除了DictCursor,并尝试了以下内容。

  1. 创建一个调用我的get_product方法的True循环。
  2. 在MySQL中更改一些行,以便找到它们。
  3. 如果我要找到0个可能的行,那么更改一些以便找到它们,我的代码只显示0,并循环说明这一点。

    如果我找到x可能的行,然后在mysql中将其更改为0,我的代码将继续循环显示x可能的行。

1 个答案:

答案 0 :(得分:1)

好的,答案如下:

db = pymysql.connect(host=.... user=... )

class MySqlTools:
    def get_products():

       mysqlcursor = db.cursor(pymysql.cursors.DictCursor)
       sql = select * from x where y = z
       mysqlcursor.execute(sql % (z))
       rows = mysqlcursor.fetchall()
       mysqlcursor.close()
       db.commit()

然后,这允许您重新使用数据库连接,并消除每次创建和关闭连接的开销。

在测试中,从我们的网站下载500个订单并将其写入数据库的时间从16分钟到<3分钟。