我正在嘗試設置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試圖在後端執行的任何操作。這對於許多時鐘來說應該是一項工作,因爲每個人可以花費數天時間完成每項任務。
說得沒錯。正如GIS世界所稱的那樣,我期待有一種「加入」。原來,我需要編寫一些代碼來自己設置它。我只是不完全確定它是否應該通過某種魔法自動處理,並且不願意自己處理它,並且踩下本來應該存在的某些功能。 –