我写了一个小应用程序,它使用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,并尝试了以下内容。
如果我要找到0个可能的行,那么更改一些以便找到它们,我的代码只显示0,并循环说明这一点。
如果我找到x可能的行,然后在mysql中将其更改为0,我的代码将继续循环显示x可能的行。
答案 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分钟。