Подтвердить что ты не робот

Улавливание предупреждения MySql

В моем python script я хотел бы уловить "данные, укороченные для столбца" xxx "," предупреждение durnig мой запрос с использованием MySql.

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

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

Спасибо всем

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
4b9b3361

Ответ 1

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

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

Ответ 2

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

SET @@sql_mode:=TRADITIONAL;

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

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

Ответ 3

Просто добавьте к Thomas Wouters ответ, нет необходимости импортировать модуль предупреждений, чтобы превратить их в ошибки. Просто запустите ваш script с ошибкой "-W" (или проигнорируйте) как флаг для Python.

Ответ 4

Если вы хотите уловить его, чтобы игнорировать его, см. "Временное подавление предупреждений" в документации 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

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

Ответ 5

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

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

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

Обработайте их в блоке try-except, например:

try:
    # a MySQL DB operation that raises a warning
    # for example: a data truncated warning
except Warning as a_warning:
    # do something here

Ответ 6

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

Ответ 7

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