On Tuesday, September 13, 2016 at 11:25:29 AM UTC-7, Joe Barnhart wrote: > > Ooooh...... I like that. I may think of that idea myself! Good job. > > -- Joe >
If going this way, I think I'd base it on Anthony's comment. /dps > On Tuesday, September 13, 2016 at 6:33:54 AM UTC-7, > tim.n...@conted.ox.ac.uk wrote: >> >> It may be a bad move, but I defined IntegrityError in a model, so it can >> be nice and terse everywhere else: >> IntegrityError = idb._adapter.driver.IntegrityError >> >> Where I have two different databases, I just added it to the database >> objects: >> db.IntegrityError = db._adapter.driver.IntegrityError >> idb.IntegrityError = idb._adapter.driver.IntegrityError >> >> Allows for nice readable except statements >> >> >> On Wednesday, 7 September 2016 20:47:48 UTC+1, Anthony wrote: >>> >>> According to the Python DB API specification, there should be a common >>> set of exceptions <https://www.python.org/dev/peps/pep-0249/#exceptions>, >>> and they should be exposed as attributes on the connection object >>> <https://www.python.org/dev/peps/pep-0249/#connection-error>. >>> Therefore, you should be able to do something like: >>> >>> try: >>> db.mytable.insert(**fields) >>> except (db._adapter.driver.IntegrityError, db._adapter.driver. >>> OperationalError) as e: >>> pass >>> >>> The above should catch the IntegrityError and OperationalError of any DB >>> API compliant driver. >>> >>> Also, when making inserts or updates, if you don't care about the >>> specific exception but just want to catch any database errors, the DAL API >>> includes the following: >>> >>> db.mytable._on_insert_error = my_insert_error_handler >>> db.mytable._on_update_error = my_update_error_handler >>> >>> >>> Anthony >>> >>> On Wednesday, September 7, 2016 at 1:14:54 PM UTC-4, Joe Barnhart wrote: >>>> >>>> So my website runs under PostgresSQL today but will likely be switched >>>> to MySql at some point in the future. My problem isn't with the DAL -- it >>>> performs fine for what it does, insulating me very well from the nuances >>>> of >>>> the SQL syntax for each engine. >>>> >>>> No, my problem comes from Exceptions. Each database engine defines its >>>> own Exceptions within its driver. Even different drivers for the same >>>> database engine (psycopg2 vs pg8000) come with different Exception trees. >>>> If I want to be able to handle database exceptions (and who doesn't?) how >>>> do I load and use the RIGHT set of Exceptions for each driver? >>>> >>>> When using the pg8000 driver for example, the Exceptions raised are all >>>> of the form: "gluon.contrib.pg8000.ProgrammingError" or some such. >>>> Errors >>>> from psycopg2 and the mysql drivers are similarly formed. I can't even >>>> use >>>> this in a try-except block unless I first import gluon.contrib.pg8000. >>>> The >>>> same is true for exceptions from all other database engines. >>>> >>>> Should we "alias" these database errors into a consistent tree inside >>>> web2py? If we created a database exception tree inside web2py, and then >>>> added to the database driver module a section that raised the >>>> corresponding >>>> web2py Exception whenever a database exception was triggered, then we >>>> could >>>> just catch ProgrammingError (from web2py) instead of >>>> gluon.contrib.pg8000.ProgrammingError. >>>> >>>> Or, should I just put somewhere in the db definition of the models a >>>> line like "import gluon.contrib.pg8000 as mydb" and then use >>>> "mydb.ProgrammingError" throughout my code? I suppose I'd need to repeat >>>> this in every module I create, and I create a LOT of modules.... >>>> >>>> Anyway, is this a real problem or am I missing something obvious?? >>>> >>>> -- Joe >>>> >>>> -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.