2013-01-15 91 views
2

這可能是一個愚蠢的問題,我已經讀了這一點:http://web2py.com/books/default/chapter/29/06#One-to-many-relationweb2py的數據庫連接和數據庫設計

但我仍然有麻煩了解我哪裏錯了我的數據庫聲明。

這裏是什麼,我想我的表看起來像佈局,引用和一切:

http://imgur.com/fpaDb

下面是我在db.py使用web2py的代碼

db.define_table('Course',Field('CallNumber','integer'),Field('Section','string',),Field('Title','string'),Field('MinCredit','integer'),Field('MaxCredit','integer'),Field('MaxEnrollment','integer'),Field('CurrentEnrollment','integer'),Field('Status','string'),Field('Instructor1','string'),Field('Term','string')) 
db.define_table('Meeting',Field('CallNumber',db.Course),Field('Day','string'),Field('StartTime','string'),Field('EndTime','string'),Field('Site','string'),Field('Building','string'),Field('Room','string'),Field('Activity','string')) 
db.define_table('Requirement',Field('CallNumber',db.Course),Field('Control','string'),Field('Argument','string'),Field('Value1','string'),Field('Operator','string'),Field('Value2','string')) 

什麼我試圖做的是確保Meeting and Requirement表格不是通過web2py分配課程表中的條目而是通過CallNumber代替的任意標識引用課程表。

任何幫助,將不勝感激。謝謝。

回答

2

參考字段存儲引用表的主鍵,即id字段。如果你想引用記錄的CallNumber值,你可以很容易地得到它,當你做一個加入:

db.define_table('Course', Field('CallNumber', 'integer'), ...) 
db.define_table('Meeting', Field('Course', db.Course), ...) 

row = db(db.Course.id == db.Meeting.Course).select().first() 
print row.Course.CallNumber 

你也可以做一個recursive select

row = db(db.Meeting).select().first() 
print row.Course.CallNumber 

注意,遞歸選擇較少在循環多個記錄時效率很高,因爲它爲每個記錄執行單獨的數據庫查詢。上面的內連接方法在這種情況下效率更高,因爲它只涉及一個查詢來檢索整個連接記錄集。

+1

這是完美的。它幫助我瞭解,連接的工作方式與我原先想象的不同。謝謝! – mike10010100