2011-01-04 10 views
2

こんにちは 私の職場の顧客データベースのこの小さなフロントエンドを書いています。私たちは、顧客や仕事やものを追跡するために、軽くてシンプルなものが必要でした。外部キーを使用したPython + SQlite3

私はPythonとSQLを同時に学習しているので混乱していますが、私が続行する前に、外来キーの関係部分全体を円滑に処理したいと考えています。だから今、私は「ジェフ」に割り当てられた2つのタスクを持っている

conn = sqlite3.connect(':memory:') 
cur = conn.cursor() 
cur.execute('''CREATE TABLE customers (custid INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, phone TEXT, email TEXT, notes TEXT)''') 
cur.execute('''CREATE TABLE tasks (taskid INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, notes TEXT, taskcust INTEGER, FOREIGN KEY(taskcust) REFERENCES customer(custid))''') 

cur.execute('''INSERT INTO customers (name, phone, email, notes) VALUES('Jeff', '555555', '[email protected]', 'balblalal')''') 
cur.execute('''INSERT INTO tasks (title, notes, taskcust) VALUES ('Toshiba A200', 'replace RAM, add 2 gigs', 1)''') 
cur.execute('''INSERT INTO tasks (title, notes, taskcust) VALUES ('WD External HDD', 'Diagnose, tick of death, hdd probably dead', 1)''') 

:私は何をしたいか

は1人の顧客ここ

に割り当てられた多数のタスクを持つことができるのは、一例です。 Jeffの連絡先情報と彼の仕事をすべて印刷したいのですが?

cur.execute('''SELECT * FROM customers where custid=1''') 
for row in cur: 
    for i in row: 
     print i 
cur.execute('''SELECT * FROM tasks WHERE taskcust=1''') 
for row in cur: 
    for i in row: 
     print i 

私はそうしていますか?

答えて

2

は、私はそれがすべてあなたが望むようにうまくいくと思う、そのほかにcur.execute('''SELECT * FROM tasks WHERE taskcust=1''')

の下

for row in cur: 
     for i in row: 
      print i 

インデントないでください。外部キーは、「RAMの交換、2ギガの追加」を依頼した顧客を探したい場合に便利です。顧客レコードをトレースすることができます。

+0

おかげでインデントはちょうどタイプミスでした:)ちょうど私が正しくそれをやっていることを確認したかった。 –

+0

それは私が考えたものです。 データベースシステムによっては、外部キーが強制されるため、タスクを挿入しようとすると特定のIDを持つ顧客が存在しないとDBがエラーをスローする可能性があります。 – mklauber

+0

私は外部キーが適切に強制されていないと考えています。私は存在しない顧客のために仕事をすることができます。顧客を削除すると、彼に割り当てられたタスクは残ります:Sは外国人が通常の整数列のように働いているようです... –

関連する問題