使用Pyramid和SQL Alchemy的ORM设计

时间:2013-03-05 15:39:14

标签: python orm sqlalchemy pyramid

我需要一些帮助来为ORM创建我的模型。

我一直在尝试使用Pyramid和SQLAlchemy设计一个Web应用程序作为个人学习体验,同时也是我希望为我工作的公司开发的Web应用程序的一个小组件。

关于此应用程序的主要背景(构建工作领域)。

它将用作我们的估算人员能够更新的出价时间表;这样我们前台的秘书就能看到谁在做什么工作,以及工作人员估计的承包商。

我设计了3个型号,它们看起来像这样:

class JobListing(Base):
    __tablename__ = 'joblist'
    id = Column(Integer, primary_key=True)
    jobname = Column(String(80), unique=True)
    biddate = Column(DateTime)

    def __init__(self, jobname, biddate):
        self.jobname = jobname
        self.biddate = biddate

class Contractors(Base):
    __tablename__ = 'contractors'
    id = Column(Integer, primary_key=True)
    name = Column(String(80), unique=True)
    address = Column(String(255))
    phone = Column(String(11))
    fax = Column(String(11))

    def __init__(self, name, address, phone, fax):
        self.name = name
        self.address = address
        self.phone = phone
        self.fax = fax

class BiddingList(Base):
    __tablename__ = 'biddinglist'
    id = Column(Integer, primary_key=True)
    job_id = Column(Integer, ForeignKey("joblist.id"))
    job = relationship("JobListing", backref=backref("joblist", order_by=id))
    contractor_id = Column(Integer, ForeignKey("contractors.id"))
    contractors = relationship("Contractors", backref=backref("contractors", order_by=id))
职位列表包含实际的职位信息;工作名称和投标日期就是所需要的。

承包商包含我们将要出价的实际承包商特有的信息,仅包括电话传真等标准信息。

竞价列表将包含我不确定如何组织的信息。我认为这是正确的方法,但它应该将承包商连接到工作ID。

承包商每份工作只能列一次,但工作可以有很多承包商。

我的问题是,我是否采用这种设计正确的方式或者我是否完全在左侧?我只是想从一开始就采用正确的方式,这样我就有了坚实的基础。

1 个答案:

答案 0 :(得分:0)

如果您不需要在BiddingList对象中存储任何其他信息,只需job_idcontractor_id - 此模式称为many-to-many relationship,SQLAlchemy文档有一个如何设置它的例子。基本上,在这种情况下你不需要一个中间的ORM类(虽然你需要一个表),并且在你设置了所有内容之后,用法看起来像

job = JobListing(jobname="Test Job")
job.contractors.append(joe)
job.contractors.append(bob)
print bob.jobs
> [<JobListing "Test Job">]
bob.jobs.append(another_job)
print bob.jobs
> [<JobListing "Test Job">, <JobListing "Another Job">]

- 一切都很好而且透明。

如果您想在多对多关系中存储一些其他信息(例如,承包商在每个role中可以有不同的JobListing) - 这是一个名为{的不同模式{3}}

如果您想限制关系,那么每个承包商只需添加一次,我会考虑指定Association Object

现在你知道所有可以使它发挥作用的神奇词语:)

另外一个注意事项 - 尽管网上有一些示例,但您不需要为每个ORM类添加构造函数 - SQLAlchemy提供了一个默认的__init__方法,该方法接受与列名相匹配的参数: / p>

class JobListing(Base):
    __tablename__ = 'joblist'
    id = Column(Integer, primary_key=True)
    jobname = Column(String(80), unique=True)
    biddate = Column(DateTime)

obj = JobListing(jobname="Test Job", biddate=datetime.now())