[Tutor] How to test for the existence of a table in a sqlite3 db?
Peter Otten
__peter__ at web.de
Sat Oct 14 05:45:08 EDT 2017
boB Stepp wrote:
> On Sat, Oct 14, 2017 at 2:11 AM, boB Stepp <robertvstepp at gmail.com> wrote:
>
>> So I get "None" as a result if the target table has not been created
>> yet. But if I *do* create the table I want:
>>
>> py3: with open('create_sqlite3_db.sql') as f:
>> ... sql = f.read()
>> ...
>> py3: c.executescript(sql)
>> <sqlite3.Cursor object at 0x00000000026B4490>
>> py3: tb_exists = "select name from sqlite_master where type='table'
>> and name='BloodPressureReadings'"
>> py3: tb_ck = c.execute(tb_exists).fetchone()
>> py3: print(tb_ck)
>> ('BloodPressureReadings',)
>>
>> So it is looking like I can use this technique to determine if I need
>> to create the BloodPressureReadings table or not. Am I on track here
>> or is there a better technique?
>
> It just occurred to me after sending the above, does something like
> "sqlite_master" exist for other database programs than sqlite3? Can I
> abstract out "sqlite_master" and replace it with a variable so that I
> can handle any kind of database?
If this is a long term project there will be changes in the schema.
However, I don't think it is necessary to check for individual tables. You
typically start with a few tables
create table alpha
create table beta
create table gamma
and later add a few more or change columns
alter table alpha
create table delta
In this example you have three versions of the database
version 0: empty
version 1: three tables
version 2: four tables, one table modified
If you add a table for your own metadata you ownly need to store that
version number. The necessary steps when you open the database are then
- read version from bobs_metadata (if that fails you are at version 0)
If you are at version 0 "migrate" to version one:
- execute script that creates alpha, beta, gamma, and bobs_metadata, the
latter with one row containing version=1
If you are at version 1 migrate to version two:
- execute migration script from 1 to 2 modifying alpha, creating delta, and
updating to version=2
If you are at version 2:
- do nothing, database is already in the state required by your application.
Pseudo-code:
scripts = ["0to1.sql", "1to2.sql"]
current_version = get_schema_version() # this has to catch the
# OperationalError
for scriptname in scripts[current_version:]:
with open(scriptname) as f:
script = f.read()
executescript(script)
More information about the Tutor
mailing list