Улавливание предупреждения 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
Ответы
Ответ 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.