2015-04-21 27 views
1

我正在嘗試設置Sqlalchemy,並且遇到了設置表格之間關係的問題。這很可能是我的誤解。當與另一張桌子的關係建立時,不填充Sqlalchemy ID字段

表設置爲如此。重要的一行是兩個星號之一,與表格「工作」建立關係。

class Clocktime(Base): 
"""Table for clockin/clockout values 

ForeignKeys exist for Job and Employee 
many to one -> employee 
many to one -> job 
""" 

__tablename__ = "clocktimes" 
id = Column(Integer, primary_key=True) 
time_in = Column(DateTime) 
time_out = Column(DateTime) 
employee_id = Column(Integer, ForeignKey('employees.id')) 
**job_id = Column(Integer, ForeignKey('jobs.id'))** 
# employee = many to one relationship with Employee 
# job = many to one relationship with Job 

@property 
def timeworked(self): 
    return self.time_out - self.time_in 

@property 
def __str__(self): 
    formatter="Employee: {employee.name}, "\ 
       "Job: {job.abbr}, "\ 
       "Start: {self.time_in}, "\ 
       "End: {self.time_out}, "\ 
       "Hours Worked: {self.timeworked}, "\ 
       "ID# {self.id}" 
    return formatter.format(employee=self.employee, job=self.job, self=self) 

現在,就業表如下。檢查帶星號線:

new_task_job = [Job(abbr=abbrev, name=project_name, rate=p_rate), Clocktime(time_in=datetime.datetime.now())] 
    for i in new_task_job: 
     session.add(i) 
    session.commit() 
    start_time = datetime.datetime.now() 
    status = 1 

然後,當:

class Job(Base): 
"""Table for jobs 

one to many -> clocktimes 
note that rate is cents/hr""" 

__tablename__ = "jobs" 
id = Column(Integer, primary_key=True) 
name = Column(String(50)) 
abbr = Column(String(16)) 
rate = Column(Integer) # cents/hr 
**clocktimes = relationship('Clocktime', backref='job', order_by=id)** 

def __str__(self): 
    formatter = "Name: {name:<50} {abbr:>23}\n" \ 
       "Rate: ${rate:<7.2f}/hr {id:>62}" 
    return formatter.format(name=self.name, 
          abbr="Abbr: " + str(self.abbr), 
          rate=self.rate/100.0, 
          id="ID# " + str(self.id)) 

當用戶啓動一個新的任務,下面的代碼是爲了編寫有關數據表工作和clocktimes執行用戶休息一下...

new_break = Clocktime(time_out=datetime.datetime.now()) 
    session.add(new_break) 
    session.commit() 

如果你看截圖,job_id字段沒有被填充。不應該使用來自作業表的主鍵(id)填充,根據

job_id = Column(Integer, ForeignKey('jobs.id')) 

或者我錯過了什麼?我假設我要編寫代碼來做到這一點,但我不想破壞Sqlalchemy試圖在後端執行的任何操作。這對於許多時鐘來說應該是一項工作,因爲每個人可以花費數天時間完成每項任務。

Clocktimes Table

回答

0

檢查出docs它 看起來你已經設置了對JobClockTime對象稱爲clocktimes的集合和.job屬性上ClockTime將參考上級Job對象。

預期的行爲是,

c1 = ClockTime() 
j1 = Job() 

>>> j1.clocktimes 
[] 
>>> print c1.job 
None 

當填充j1.clocktimes一個對象,你也應該看到c1.job獲得非None值。

j1.clocktimes.append(c1) 
>>> j1.clocktimes 
[an instance of `ClockTime`] 
>>> c1.job 
[an instance of `Job`] 

你是否發現此行爲?我沒有在您的代碼中看到您填充clocktimes的位置,因此從未觸發job的人口。

我認爲你期望在列定義中增加ForeignKey來做一些它沒有做的事情。您在job_id上放置的ForeignKey約束僅表示它受限於Jobs表的id列中的值。查詢here瞭解更多詳情

+0

說得沒錯。正如GIS世界所稱的那樣,我期待有一種「加入」。原來,我需要編寫一些代碼來自己設置它。我只是不完全確定它是否應該通過某種魔法自動處理,並且不願意自己處理它,並且踩下本來應該存在的某些功能。 –

相關問題