SQLAlchemy - 在另一个实例中创建一个实例__init__

时间:2011-11-27 03:21:18

标签: python sqlalchemy

对SQLAlchemy来说很新(所以我的术语可能有点过时)。我想在另一个构造函数内部创建一个数据库对象,但问题是我无法将所述对象添加到会话中,因此我收到错误。

我的架构看起来有点像:

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, Sequence('tag_id_seq'), primary_key=True, nullable=False)
    type = Column(String(1), nullable=False)
    name = Column(String(255), unique=True, nullable=False)

    def __init__(self, type, name):
        self.type=type
        self.name=name

    def __repr__(self):
        return "<Tag('%s')>" % (self.id)


class Venue:
    __tablename__ = 'venue'

    tag_id = Column(Integer)
    tag_type = Column(String(1), nullable=False)
    location = Column(String(255), nullable=False)

    tag = ForeignKeyConstraint(
            (tag_id, tag_type),
            (Tag.id, Tag.type),
            onupdate='RESTRICT',
            ondelete='RESTRICT',
            )

    def __init__(self,name,location):
        self.tag = Tag('V',name)
        self.location = location

当我执行以下操作时:

session.add(Venue("Santa's Cafe","South Pole"))

我收到错误:

UnmappedInstanceError: Class '__builtin__.instance' is not mapped

我认为这是因为在Venue的构造函数中创建的Tag对象未添加到会话中。我的问题是如何/何时这样做。 (如果可能的话,我真的更喜欢在构造函数中创建Tag对象)。我想我可以用scoped_session做到这一点,但这似乎是一个非常糟糕的解决方案。

由于

1 个答案:

答案 0 :(得分:2)

  1. Venue继承Base。否则Venue将不会被映射。
  2. ForeignKeyConstraint移至__table_args__
  3. 将当前无意义的tag属性替换为relationshipTagcascade relationship参数的默认值包含'save-update'规则,该规则将新的引用对象添加到与父项相同的会话中。
  4. 来自documentation:

      

    save-update - 级联Session.add()操作。这个级联   适用于add()的未来和过去调用,表示新项目   添加到集合或标量关系放入相同   会话作为父级的会话,也适用于具有的会话   已被从这种关系中删除,但仍然是未刷新的一部分   历史。