Как я могу проверить, была ли вставка успешной с MySQLdb в Python? - PullRequest
9 голосов
/ 26 января 2012

У меня есть этот код:

cursor = conn.cursor()
cursor.execute(("insert into new_files (videos_id, filename, "
                "is_processing) values (%s,%s,1)"), (id, filename))
logging.warn("%d", cursor.rowcount)
if (cursor.rowcount == 1):
    logging.info("inserted values %d, %s", id, filename)
else:
    logging.warn("failed to insert values %d, %s", id, filename)
cursor.close()

Забавно, но cursor.rowcount равно всегда , хотя я обновил свою базу данных, чтобы сделать videos_id уникальным ключом. То есть вставка не удалась, потому что в моих тестах будет отображаться тот же videos_id (и когда я проверяю базу данных, ничего не было вставлено). Но по какой-то причине rowcount всегда равен 1 - даже у меня logging.warn выплевывает rowcount из 1.

Итак, вопрос:
Могу ли я использовать rowcount, чтобы убедиться, что вставка прошла нормально? Если так, что я (по-видимому) делаю неправильно? в противном случае, как проверить, что вставка прошла нормально?

Ответы [ 5 ]

28 голосов
/ 26 января 2012

Ваш код не фиксируется после изменений (ваши изменения откатываются). То есть вы должны добавить следующую строку после cursor.execute:

conn.commit()

Неудачная вставка выдаст MySQLdb.IntegrityError, поэтому вы должны быть готовы ее поймать.

Таким образом, ваш код должен выглядеть примерно так:

sql_insert = """insert into new_files (videos_id, filename, is_processing)
values (%s,%s,1)"""

cursor = conn.cursor()
try:
    affected_count = cursor.execute(sql_insert, (id, filename))
    conn.commit()
    logging.warn("%d", affected_count)
    logging.info("inserted values %d, %s", id, filename)
except MySQLdb.IntegrityError:
    logging.warn("failed to insert values %d, %s", id, filename)
finally:
   cursor.close()
3 голосов
/ 20 октября 2015

У меня недостаточно репутации, чтобы комментировать, но вот важное замечание:

Также возможно, что execute () завершится с ошибкой, если вы не зафиксировали после вызова. А именно, таблицы MyISAM не требуют фиксации, в отличие от таблиц InnoDB.

1 голос
/ 26 января 2012

Как насчет использования блока try / catch вместо просмотра количества строк. Если это ловит исключение, тогда есть проблема; в противном случае, нет проблем.

1 голос
/ 26 января 2012

Если вставка не удалась, вы получите повышенное исключение, или кто-то закричит, или вы упадете со стула.

0 голосов
/ 18 декабря 2018

Сохранить оператор вставки в строке и распечатать его после. Если произойдет исключение, инструкция не будет напечатана.

sql_insert = """insert into new_files (videos_id, filename, is_processing)
values (%s,%s,1)"""
cur.execute(sql_insert)
print('Executed:', sql_insert)
...