У меня странная проблема MySQL в моих модульных тестах, я делаю что-то вроде ниже:
@patch("myobject.MyObject._some_method")
def test_sync_db(self, mock_m):
test_data = {
"id": "1",
"description": "Some text",
}
# Run the code in the test
myobj = MyObject()
myobj.some_data = test_data
myobj.doSomethingWithDb()
# Read the DB to make sure the correct changes were made
myobj.db.connect()
data = myobj.db.read_data(test_data["id"])
print(data["descriptionn"])
myobj.db.disconnect()
Приведенный выше код работает нормально, пока он не достигнет второй последней строки, я специально поставил дополнительный Символ «n» в конце, так как нет ключа, соответствующего «descriptionn», я ожидаю, что код взломает sh. Однако вместо того, чтобы код завис и MySQL завис, вся таблица базы данных облажалась, и мне пришлось перезапустить сервер MySQL, чтобы восстановиться после этого. Я не могу понять, почему это происходит, myobj.db.read_data
буквально просто возвращает fetchone()
из объекта MySQLdb.
РЕДАКТИРОВАТЬ: В соответствии с запросом, это действительно то, что doSomethingWithDb()
делает:
def doSomethingWithDb(self):
self.db.connect()
for data in self.some_data:
exists = self.db.read_data(data["id"])
if exists:
self.db.update_data(exists)
else:
self.db.create_data(exists)
self.db.disconnect()
EDIT 2: Adding problematic code:
The self.db.read_data method does the following:
def read_data(self, ...):
...
self.dbcurs.execute(params)
data = self.dbcurs.fetchone()
return data
The problem is fixed if I add in `self.dbconn.commit()` immediately after the `data = self.dbcurs.fetchone()` line, not sure why though. If anyone can explain then I will accept that as an answer.