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语法