On Aug 25, 10:51 am, "Karen Tracey" <
kmtra...@gmail.com> wrote:
> I just noticed that the MySQL backend also fails on this get_or_create
> test. It is returning an OperationalError instead of an IntegrityError.
> Looks like MySQL returns errno 1364 (ER_NO_DEFAULT_FOR_FIELD) in this case
> but this is not recognized as anything special in MySQLdb so it's just
> mapped to a general OperationalError. I don't see a corresponding place in
> the mysql backend to do the sort of catch & transform you have found to do
> with Oracle?
OperationalError according to PEP 249 is for "errors that are related
to the database's operation and not necessarily under the control of
the programmer, e.g. an unexpected disconnect occurs, the data source
name is not found, a transaction could not be processed, a memory
allocation error occurred during processing, etc." That doesn't seem
to fit an INSERT lacking a NOT NULL value (and no table default
value).
So at first glance, I'd say that's a bug in MySQLdb that should be
rectified so it also raises IntegrityError. And following what I just
committed in [8545], we should perhaps find a way to work around the
driver so we can rely on IntegrityError in this situation. But since
the MySQL backend isn't as customized as Oracle, there's no existing
place to trap this. We could add execute() and executemany() to a new
MySQLCursor class to fix it similarly, but as Senator Obama likes to
say, "that's above my pay grade."
> Karen