recommended way to insert data into a one to many relationship using python

Bryan bryanjugglercryptographer at yahoo.com
Sun May 2 15:05:32 EDT 2010


Wolfgang Meiners wrote:
> one to many relationships are fairly common, i think. So there should be
> a recommended way to insert data into such a relation using python.
>
> Given the following programm, what is the recommended way to insert the
> list of NewEmployees to the database?
>
> ========================================================================
> # !python
> # -*- coding: utf-8 -*-
>
> import sqlite3
>
> con = sqlite3.connect(":memory:")
> cur = con.cursor()
>
> cur.execute("""create table employees(
>     eid integer primary key autoincrement,
>     name text not null,
>     rid integer references rooms(rid))""")
>
> cur.execute("""create table rooms(
>     rid integer primary key autoincrement,
>     number integer,
>     fid integer references floors(fid))""")
>
> cur.execute("""create table floors(
>     fid integer primary key autoincrement,
>     floor text not null)""")
>
[...]
>
> NewEmployees  =[]
> NewEmployees.append({'name': 'George', 'room': 89, 'floor': 'third floor'})
> NewEmployees.append({'name': 'Ellen', 'room': 21, 'floor': 'first floor'})
>

For that kind of insert to be well-defined, the pair (floor,
room_number) must uniquely identify a room. When natural keys like
that are availabe, they're the obvious choice for primary keys in the
database schema. I suggested getting rid of fid and rid, as in:


schema = """
CREATE TABLE floors (
    floor TEXT PRIMARY KEY
);

CREATE TABLE rooms (
    floor TEXT REFERENCES floors,
    number INTEGER,
    PRIMARY KEY (floor, number)
);

CREATE TABLE employees (
    eid INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
    floor TEXT,
    room_number INTEGER,
    FOREIGN KEY (floor, room_number) REFERENCES rooms
)
"""

con = sqlite3.connect(":memory:")
for cmd in schema.split(';'):
    con.execute(cmd)
con.close()



--
--Bryan



More information about the Python-list mailing list