[Tutor] How to test for the existence of a table in a sqlite3 db?

boB Stepp robertvstepp at gmail.com
Sun Oct 15 01:48:27 EDT 2017

On Sun, Oct 15, 2017 at 12:07 AM, boB Stepp <robertvstepp at gmail.com> wrote:

> ================================================================================
> #!/usr/bin/env python3
> """This file starts the blood pressure readings program."""
> import sqlite3
> def ensure_db(filename):
>     """Open the database, "filename", if it exists; otherwise, create a
>     database named "filename"."""
>     db = sqlite3.connect(filename)
>     cur = db.cursor()
>     try:
>         sql_cmd = "SELECT VersionNumber FROM CurrentDBVersion"
>         # First element of returned tuple will be the db version number:
>         current_db_version = int(cur.execute(sql_cmd).fetchone()[0])
>     except sqlite3.OperationalError:
>         # This means that the database and the table, "CurrentDBVersion", has
>         # not yet been created, implying "version 0".
>         current_db_version = 0
>     finally:
>         sql_scripts = ["../database/create_sqlite3_db.sql"]
>         for sql_scriptname in sql_scripts[current_db_version:]:
>             with open(sql_scriptname) as f:
>                 cur.executescript(f.read())
>     return db

I have not used a "finally" block before.  I just had the thought that
maybe it would run even if an uncaught exception might occur.  I tried
to test this thought by generating a deliberate NameError in the "try"
block and added a print to the "finally" clause.  I got the intended
NameError with no evidence of the added print printing.  But I thought
I would ask just to be sure:  If an uncaught exception occurs, will
the "finally" clause execute?

> I have chickened out and not done a TDD approach yet.  I will probably
> pause here, wait for feedback from this list, and try to figure out
> how I should test what I have so far.  And how do you test SQL scripts
> anyway?
> Some things I am still pondering:

I forgot to add (5):

5)  How should I handle the cursor object?  When I should I close it?
My function returns "db" which I presume keeps the connection to the
database.  But what happens to the cursor object as I have written the
function, since I never closed it?


More information about the Tutor mailing list