在sqlalchemy中创建新模型会触发数据库上的INSERT

时间:2015-10-07 12:50:29

标签: python orm sqlalchemy

在编写新测试时,我发现了一个非常好奇的案例:

models.ArticleTag(tag=tag, article=article)

在数据库上触发INSERT语句,即使之后没有Session.add。

但是,如果我将代码更改为如下所示:

models.ArticleTag(tag.id=tag.id, article=article)

不会发生INSERT。

在这种情况下的文章是新的对象,它还不在db中,而tag是我们已经在db中的东西。

我的模特看起来像这样:

class Tag(object):
    __tablename__ = 'tag'

    title = sqlalchemy.Column(sqlalchemy.Unicode(255), nullable=False)
    type = sqlalchemy.Column(sqlalchemy.Unicode(255))
    uid = sqlalchemy.Column(sqlalchemy.Unicode(32), primary_key=True, nullable=False)

    __table_args__ = (
        sqlalchemy.UniqueConstraint('type', 'title', name='title_type_unique'),
    )


class ArticleTag(object):
    """Represent m2m table between Tags and Article.
    association obj for mapping m2m articles<->tags
    """
    __tablename__ = 'article_tag'

    article_uid = sqlalchemy.Column(sqlalchemy.Unicode(32), sqlalchemy.ForeignKey('article.uid'), primary_key=True)
    tag_uid = sqlalchemy.Column(sqlalchemy.Unicode(32), sqlalchemy.ForeignKey('tag.uid'), primary_key=True)

    priority = sqlalchemy.Column(sqlalchemy.Integer, default=0)

    tag = sqlalchemy.orm.relationship('Tag', backref='articles')


class Article(object):
    __tablename__ = 'article'

    uid = sqlalchemy.Column(sqlalchemy.Unicode(32), primary_key=True, nullable=False)
    title = sqlalchemy.Column(sqlalchemy.Unicode(255), nullable=False)
    meta_description = sqlalchemy.Column(sqlalchemy.Unicode(255))
    meta_title = sqlalchemy.Column(sqlalchemy.Unicode(255))
    body = sqlalchemy.Column(sqlalchemy.Unicode)
    is_active = sqlalchemy.Column(sqlalchemy.Boolean, default=True)

    # any tags we have
    article_tags = sqlalchemy.orm.relationship('ArticleTag', backref='article', cascade='all, delete-orphan', order_by=lambda: sqlalchemy.desc(ArticleTag.priority))

    @property
    def tags(self):
        """Helper method that will return tags sorted by priority.
        """
        return [art_tag.tag for art_tag in self.article_tags]

我的猜测是,我不知道sqlalchemy非常重要的事情。

任何人都可以指出方向吗?

0 个答案:

没有答案