Skip to content

Commit

Permalink
Handle CLI load into existing tables gracefully (PR #295)
Browse files Browse the repository at this point in the history
- Add exception handling for SQLite, PostgreSQL, and MySQL.
Sqlalchemy gives different exceptions for each database engine so I have
seperated each exception for each engine.
The error message passed by each engine is also different so that is
checked as well.
- Once the function gets one of those exceptions the following message
is outputed and the program ends: `ERROR:  Table 'TABLENAME' already
exists in the database. Did you mean to use 'pokedex load -D'`
- If the error is not that a table already exists, then the output will
just be the full error from sqlalchemy. That way if someone runs into
that error it can be reported as an issue and whoever can help would see
the full error.
---
Resolves part of issue #16
  • Loading branch information
rluzuriaga authored and magical committed Jun 17, 2020
1 parent c2cde00 commit cf37c71
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion pokedex/db/load.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,29 @@ def load(session, tables=[], directory=None, drop_tables=False, verbose=False, s

print_start('Creating tables')
for n, table in enumerate(table_objs):
table.create(bind=engine)
try:
table.create(bind=engine)

# Exceptions for handling the error thrown when trying to load
# the database with a table that already exists.
except (
sqlalchemy.exc.OperationalError, # Exception used for SQLite
sqlalchemy.exc.ProgrammingError, # Exception used for PostgreSQL
sqlalchemy.exc.InternalError # Exception used for MySQL
) as error:

if "already exists" in str(error.orig):
print("\n\nERROR: The table '{}' already exists in the database. "
"Did you mean to use 'pokedex load -D'".format(table))
sys.exit(1)

# If it happens to be some other error but raised by the same
# exception, then an unexpected error message is sent with
# the error included
else:
print("\n\n UNEXPECTED ERROR: ", error)
sys.exit(1)

print_status('%s/%s' % (n, len(table_objs)))
print_done()

Expand Down

0 comments on commit cf37c71

Please # to comment.