我在一個程序上工作到克隆我的數據庫中的行從一個用戶到另一個用戶。它適用於我選擇行,編輯幾個值然後將其插回。在循環結果集時插入行
我還需要存儲新插入的行ID與他們現有的對應,以便我可以稍後克隆一些其他鏈接表。
我的代碼如下所示:
import mysql.connector
from collections import namedtuple
con = mysql.connector.connect(host='127.0.0.1')
selector = con.cursor(prepared=True)
insertor = con.cursor(prepared=True)
user_map = {}
selector.execute('SELECT * FROM users WHERE companyID = ?', (56,))
Row = namedtuple('users', selector.column_names)
for row in selector:
curr_row = Row._make(row)
new_row = curr_row._replace(userID=None, companyID=95)
insertor.execute('INSERT INTO users VALUES(?,?,?,?)', tuple(new_row))
user_map[curr_row.userID] = insertor.lastrowid
selector.close()
insertor.close()
運行此代碼,我得到以下錯誤:
mysql.connector.errors.InternalError: Unread result found
我假設這是因爲我試圖運行INSERT
而我仍然循環了SELECT
,,但我認爲使用兩個遊標可以解決這個問題。爲什麼我仍然通過多個遊標得到這個錯誤?
我找到了一個使用fetchall()
的解決方案,但是我擔心會使用太多的內存,因爲可能會有從SELECT
返回的數千個結果。
import mysql.connector
from collections import namedtuple
con = mysql.connector.connect(host='127.0.0.1')
cursor = con.cursor(prepared=True)
user_map = {}
cursor.execute('SELECT * FROM users WHERE companyID = ?', (56,))
Row = namedtuple('users', cursor.column_names)
for curr_row in map(Row._make, cursor.fetchall()):
new_row = curr_row._replace(userID=None, companyID=95)
cursor.execute('INSERT INTO users VALUES(?,?,?,?)', tuple(new_row))
user_map[curr_row.userID] = cursor.lastrowid
cursor.close()
這可行,但速度不是很快。我在考慮而不是使用fetchall()
會更快,但是如果我沒有獲取完整的結果集,那麼MySQL會大聲吼我。
是否有插入行而遍歷結果集沒有獲取整個結果集的方法嗎?