#12293 closed (wontfix)
mysql backend raises Warning exceptions for ignorable info notices
| Reported by: | Walter Doekes | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | dev |
| Severity: | Keywords: | mysql warnings note | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
For example, when I use the custom /sql/mymodel.mysql.sql with something like:
DROP VIEW IF EXISTS myview;
python-mysqldb raises a Database.Warning to warn us of the info that the table did not exist.
mysql> drop view if exists myview; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> show warnings; +-------+------+-----------------------------+ | Level | Code | Message | +-------+------+-----------------------------+ | Note | 1051 | Unknown table 'mydb.myview' | +-------+------+-----------------------------+ 1 row in set (0.00 sec)
This Warning gets propagated when DEBUG==True (because it's not filterwarning'd) and then the rest of my custom SQL does not get run.
I propose a check against 'Note' level warnings, ignoring those. See my attached patch.
(I created a third function to avoid more duplicate code. I don't know if this extra call decreases performancy any.)
Regards,
Walter Doekes
OSSO B.V.
Attachments (1)
Change History (3)
by , 16 years ago
| Attachment: | django-ignore-mysql-notes.patch added |
|---|
comment:1 by , 16 years ago
| Resolution: | → wontfix |
|---|---|
| Status: | new → closed |
I disagree that Django should be throwing away data returned by the cursor. If you don't want notes to be reported by the cursor, might I suggest the use of the sql_notes variable.
comment:2 by , 16 years ago
Okay, that works for me. Thanks :)
A possible implementation for others experiencing the same issue:
class suppressed_sql_notes(object):
'''
Pimp a cursor object to suppress SQL notes and re-enable the
original configuration when done.
Use this in a with statement, like so:
with suppressed_sql_notes(connection.cursor()) as cursor:
cursor.execute('STUFF THAT YIELDS HARMLESS NOTICES')
See django bug #12293 marked as WONTFIX.
'''
def __init__(self, cursor):
self.cursor = cursor
def __enter__(self):
self.cursor.execute('''SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0;''')
return self.cursor
def __exit__(self, type, value, traceback):
self.cursor.execute('''SET SQL_NOTES=@OLD_SQL_NOTES;''')
And those two SQL statements at the beginning and end of your custom SQL files.
Ignore 'Note'-level warnings from mysqldb.