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

Wolfgang Meiners WolfgangMeiners01 at web.de
Mon May 3 13:46:19 EDT 2010


Wolfgang Meiners schrieb:

[... example of a simple sql-database and relating questions ...]

so after reading the hints of Peter Otten and Bryan i played around a
bit and got the following solution. Of course it would be much simpler
following Bryans idea of natural keys but i think, i will go step by
step. Any useful comments appreacheated.
Wolfgang


================================================================================
# !python
# -*- coding: utf-8 -*-

import sqlite3

schema = """
create table floors (
        fid integer primary key autoincrement,
        floor text not null);

create table rooms (
        rid integer primary key autoincrement,
        number integer,
        fid integer references floors(fid));

create table employees (
        eid integer primary key autoincrement,
        name text not null,
        rid integer references rooms(rid));

create view emplist as select name, number, floor
        from employees natural inner join rooms natural inner join floors;
"""


#con = sqlite3.connect("test.db")
con = sqlite3.connect(":memory:")
cur = con.cursor()
for cmd in schema.split(';'):
    cur.execute(cmd)

def insert_new_value(d):
    sql = """insert or ignore into floors(floor)
    select :floor
    where not exists (select * from floors where floor = :floor)"""
    cur.execute(sql,d)

    sql = """insert or ignore into rooms (number, fid)
    select :number, fid from floors
    where floor = :floor
    and not exists (select * from rooms natural inner join floors
    where number = :number and floor = :floor)"""
    cur.execute(sql,d)

    sql  = """insert or ignore into employees(name,rid)
    select :name, rid from rooms natural inner join floors
    where number = :number and floor = :floor
    and not exists (select * from employees natural inner join rooms
            natural inner join floors where
            name = :name and number = :number and floor = :floor) """
    cur.execute(sql,d)

NewEmployees  =[]
NewEmployees.append({'name': 'Joe', 'number': 21, 'floor': 'first floor'})
NewEmployees.append({'name': 'Nancy', 'number': 22, 'floor': 'second
floor'})
NewEmployees.append({'name': 'George', 'number': 89, 'floor': 'third
floor'})
NewEmployees.append({'name': 'Ellen', 'number': 21, 'floor': 'first floor'})
NewEmployees.append({'name': 'Joe', 'number': 21, 'floor': 'first floor'})

print "Old Values:"
print cur.execute("""select * from emplist order by name """).fetchall()

for d in NewEmployees:
    insert_new_value(d)

print "New Values:"
print cur.execute("""select * from emplist order by name """).fetchall()

con.close()

================================================================================



More information about the Python-list mailing list