recommended way to insert data into a one to many relationship using python
Wolfgang Meiners
WolfgangMeiners01 at web.de
Mon May 3 03:03:57 EDT 2010
Bryan schrieb:
> 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
This looks interesting to me. I would have all necessary information in
table employees. But i think the additional tables for rooms and floors
are necessary too, to have a normalized database.
I thougth of a function like try_insert_and_return_key(x,y) for the
tables but i had difficulties to write such a function. In this function
x should be the key and y the depended data that can be compound.
Nevertheless, with a given y there might be more then one x and i think,
this is exactly what you stated above.
Thank you for this hint
Wolfgang
More information about the Python-list
mailing list