перехват предупреждения MySql - PullRequest
35 голосов
/ 20 января 2010

В моем скрипте на python я хотел бы перехватить предупреждение «Усеченные данные для столбца« xxx »» во время моего запроса с использованием MySql.

Я видел несколько постов, предлагающих приведенный ниже код, но он не работает.

Знаете ли вы, должен ли какой-то конкретный модуль быть импортирован или должен быть вызван какой-либо параметр / флаг перед использованием этого кода?

Спасибо всем

Afeg

import MySQLdb
try:
    cursor.execute(some_statement)
    # code steps always here: No Warning is trapped
    # by the code below
except MySQLdb.Warning, e:
    # handle warnings, if the cursor you're using raises them
except Warning, e:
    # handle warnings, if the cursor you're using raises them

Ответы [ 7 ]

45 голосов
/ 20 января 2010

Предупреждения - это просто предупреждения. О них обычно сообщают (обычно) в stderr, но больше ничего не делается. Вы не можете поймать их как исключения, потому что они не поднимаются.

Однако вы можете настроить, что делать с предупреждениями, и отключить их или превратить в исключения, используя модуль warnings. Например, warnings.filterwarnings('error', category=MySQLdb.Warning), чтобы превратить MySQLdb.Warning warnings в исключения (в этом случае они будут перехвачены с использованием вашей попытки / исключений) или 'ignore', чтобы вообще их не показывать. Вы можете (и, вероятно, должны) иметь более мелкозернистые фильтры, чем просто категория.

10 голосов
/ 29 марта 2016

Поднять предупреждения MySQL как ошибки:

import warnings, MySQLdb
warnings.filterwarnings('error', category=MySQLdb.Warning)

Чтобы игнорировать, а не выдавать ошибку, замените "error" на "ignore".

Обрабатывать их в блоке try-Кроме как:

try:
    # a MySQL DB operation that raises a warning
    # for example: a data truncated warning
except Warning as a_warning:
    # do something here
5 голосов
/ 02 июня 2014

Если вы хотите перехватить его, чтобы проигнорировать, см. «Временное подавление предупреждений» в документации Python:

https://docs.python.org/2/library/warnings.html#temporarily-suppressing-warnings

import warnings

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    # Put here your query raising a warning

Иначе, просто прочитайте документацию по модулю "Предупреждения" в Python, вы можете преобразовать их в исключение, если вы хотите их отловить позже, и т. Д. ... все это здесь: https://docs.python.org/2/library/warnings.html

5 голосов
/ 20 января 2010

Я бы сначала попытался установить sql_mode. Вы можете сделать это на уровне сеанса. Если вы выполните:

SET @@sql_mode:=TRADITIONAL;

(вы также можете установить его на уровне сервера, но вам нужен доступ к серверу, чтобы сделать это. И, что установка по-прежнему будет переопределена на уровне сеанса, так что суть в том, всегда устанавливайте его в сеансе уровень, сразу после установления соединения)

тогда многие вещи, которые обычно являются предупреждениями, становятся ошибками. Я не знаю, как они проявляются на уровне Python, но очевидное преимущество заключается в том, что изменения не хранятся в базе данных. Смотри: http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_traditional

4 голосов
/ 07 июля 2011

Чтобы добавить ответ Томаса Ваутерса, не нужно импортировать модуль предупреждений, чтобы превратить их в ошибки. Просто запустите ваш скрипт с «-W error» (или игнорируйте) в качестве флага для Python.

2 голосов
/ 20 января 2010

Прекратить использование MySQLdb. У него такое глупое поведение, как усечение данных и выдача только предупреждения. Вместо этого используйте oursql .

2 голосов
/ 20 января 2010

Вы пытались использовать команду MySQL SHOW WARNINGS ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...