Python 在sqlalchemy中创建新模型会触发数据库插入

Python 在sqlalchemy中创建新模型会触发数据库插入,python,orm,sqlalchemy,Python,Orm,Sqlalchemy,在编写新测试时,我发现了一个非常奇怪的情况: models.ArticleTag(tag=tag, article=article) 即使没有Session.add after,也会在数据库上触发INSERT语句 但是,如果我将代码更改为如下所示: models.ArticleTag(tag.id=tag.id, article=article) class Tag(object): __tablename__ = 'tag' title = sqlalchemy.Colu

在编写新测试时,我发现了一个非常奇怪的情况:

models.ArticleTag(tag=tag, article=article)
即使没有Session.add after,也会在数据库上触发INSERT语句

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

models.ArticleTag(tag.id=tag.id, article=article)
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]
不会发生插入

本例中的文章是尚未在db中的新对象,标记是我们已经在db中的东西

我的模型是这样的:

models.ArticleTag(tag.id=tag.id, article=article)
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]
类标记(对象):
__tablename_uu='tag'
title=sqlalchemy.Column(sqlalchemy.Unicode(255),null=False)
type=sqlalchemy.Column(sqlalchemy.Unicode(255))
uid=sqlalchemy.Column(sqlalchemy.Unicode(32),主键=True,null=False)
__表参数=(
sqlalchemy.UniqueConstraint('type','title',name='title\u type\u unique'),
)
类ArticleTag(对象):
“”“表示标记和项目之间的m2m表。
映射m2m articlestags的关联obj
"""
__tablename_uuu='article_标签'
article\u uid=sqlalchemy.Column(sqlalchemy.Unicode(32),sqlalchemy.ForeignKey('article.uid'),primary\u key=True)
tag\u uid=sqlalchemy.Column(sqlalchemy.Unicode(32),sqlalchemy.ForeignKey('tag.uid'),primary\u key=True)
优先级=sqlalchemy.Column(sqlalchemy.Integer,默认值=0)
tag=sqlalchemy.orm.relationship('tag',backref='articles'))
类别文章(对象):
__tablename_uu='article'
uid=sqlalchemy.Column(sqlalchemy.Unicode(32),主键=True,null=False)
title=sqlalchemy.Column(sqlalchemy.Unicode(255),null=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,默认值=True)
#我们有标签吗
article_tags=sqlalchemy.orm.relationship('ArticleTag',backref='article',cascade='all,delete orphan',order_by=lambda:sqlalchemy.desc(ArticleTag.priority))
@财产
def标签(自我):
“”“Helper方法,该方法将返回按优先级排序的标记。”。
"""
return[art_tag.tag for art_tag in self.article_tags]
我猜我对炼金术不太了解


任何人都可以告诉我一个方向?

启用SQL语句日志记录(通过
create_engine(…,echo=True)
或使用日志记录模块),您可以看到sqlalchemy生成和执行的所有SQL语句。它将为您提供有关sqlalchemy的不同做法的线索。我猜您的配置中将
autocommit
设置为
True
。尝试将其设置为
False
@adarsh我已经设置了自动提交,但是我的问题是为什么sqlalchemy仅仅在生成orm模型的新实例时触发数据库插入。@van不知道它应该如何帮助我-不完全肯定这一点,但是既然您已经将自动提交集设置为true,SqLalCKy将考虑每个实例化作为事务,并且它将提交到数据库。您的第二个示例不应该工作,因为它不是有效的python语法