Соединитель Python MySQL IndexError: индекс bytearray вне диапазона
Я вставляю некоторые данные в базу данных, и большинство запросов вставляются правильно, но я получаю по крайней мере одну случайную ошибку запроса.
Я использую Python 3, MySQL 5.6.17 и MySQL Python Connector 2.1.3 (обновлен после возникновения той же проблемы с 2.0.2).
Запросы выполняются в пуле многопроцессорной обработки map_async().
multiprocessing.pool.RemoteTraceback: bytearray index out of range
Traceback (most recent call last):
File "./../../../my-python-script.py", line 930, in insert_into_database
mysql_query(mysql_script, values) # <-- My mysql wrapper function
File "./../../../my-python-script.py", line 297, in mysql_query
for row in results:
File "./../../../mysql/connector/cursor.py", line 450, in _execute_iter
result = next(query_iter)
File "./../../../mysql/connector/connection.py", line 520, in cmd_query_iter
yield self._handle_result(self._send_cmd(ServerCmd.QUERY, statements))
File "./../../../mysql/connector/connection.py", line 405, in _handle_result
self._socket.recv(), self.python_charset)
File "./../../../mysql/connector/protocol.py", line 238, in parse_column
(packet, _) = utils.read_lc_string(packet[4:]) # catalog
File "./../../../mysql/connector/utils.py", line 199, in read_lc_string
if buf[0] == 251: # \xfb
IndexError: bytearray index out of range
The above exception was the direct cause of the following exception:
IndexError: bytearray index out of range
Или иногда я получаю (из строки "для строки в результатах")
File "./../../../mysql/connector/cursor.py", line 450, in _execute_iter
result = next(query_iter)
File "./../../../mysql/connector/connection.py", line 520, in cmd_query_iter
yield self._handle_result(self._send_cmd(ServerCmd.QUERY, statements))
File "./../../../mysql/connector/connection.py", line 384, in _handle_result
elif packet[4] == 0:
IndexError: bytearray index out of range
The above exception was the direct cause of the following exception:
IndexError: bytearray index out of range
Моя установка что-то вроде
class InsertData:
def __init__(self):
with(multiprocessing.Pool(2) as Pool:
Pool.map_async(self.insert_into_database(),set(1,2,3.....))
Pool.close()
Pool.join()
def insert_into_database(self,values):
# use the values to do some calculations then insert to database
mysql_query(mysql_script, values)
def mysql_query(script, values):
cursor.execute(query, values, multi = True)
И сценарий SQL
'INSERT INTO table1 ( column1 ) VALUES ( "x" ); '
'SET @table1 = LAST_INSERT_ID(); '
'INSERT INTO table2 ( column1, column2 ) VALUES ( "y", @table1 ); '
'SET @table2 = LAST_INSERT_ID(); '
...
В настоящее время я смотрю на файл connector.py и код утилиты, пытаясь понять, что происходит. Но это слишком сложно для меня.
https://github.com/mysql/mysql-connector-python/blob/master/lib/mysql/connector/connection.py
https://github.com/mysql/mysql-connector-python/blob/master/lib/mysql/connector/utils.py
В отчаянной попытке я попытался установить для буферизованного True значение https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorbuffered.html
Мне нужно прочитать о байт-массивах, но я подозреваю, что мой скрипт запроса вызывает проблему, потому что у меня не было (я думаю?) Этой проблемы, когда я запускал запросы по одному соединителю за раз cursor.execute(query, values, multi = False)
1 ответ
Когда я отправляю соединение с базой данных, как описано в разделе Доступ к пулу соединений MySQL из многопроцессорной обработки Python, проблема исчезает.
Что-то вроде
mysql_conn = None
def db_conn():
global mysql_conn
mysql_conn = connector.connect(...)
class InsertData:
def __init__(self):
with(multiprocessing.Pool(2, initializer = db_conn) as Pool:
Pool.map_async(self.insert_into_database(),set(1,2,3.....))
Pool.close()
Pool.join()
def insert_into_database(self,values):
# use the values to do some calculations then insert to database
self.mysql_query(mysql_script, values)
def mysql_query(script, values):
cursor = mysql_conn.cursor()
cursor.execute(query, values, multi = True)