- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谁能帮我理解以下行为?我有一个简单的模式,其中一个项目有很多 Assets 和元素。 Assets 和元素在项目范围内具有多对多关系。
我需要确保元素具有在项目范围内唯一的代码,因此在将新元素添加到 SQLAlchemy session 之前,我想检查是否已经存在具有相同代码的元素在项目中。我发现的是,当我使用关联表来映射元素和 Assets 之间的多对多关系时,如果查询操作实际上将新元素提交给数据库,我就无法查询数据库。
明确地说,此时我还没有add 编辑或提交 编辑这个新元素到 SQLAlchemy session 。
from sqlalchemy import create_engine, and_
from sqlalchemy import Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relation, backref
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.associationproxy import association_proxy
### your credentials here ###
# _MYSQL_DB =
# _MYSQL_USER =
# _MYSQL_PWORD =
# _MYSQL_SCHEMATA =
# _MYSQL_TEST_SCHEMATA =
testEngine = create_engine("mysql://%s:%s@%s/%s"%( _MYSQL_USER,
_MYSQL_PWORD,
_MYSQL_DB,
_MYSQL_TEST_SCHEMATA),
pool_recycle=3600,
echo=True)
Base = declarative_base()
SQLAlchemySession = sessionmaker(autoflush=True, autocommit=False)
class Project(Base):
__tablename__ = "SA_project_t"
id = Column(Integer, primary_key=True, autoincrement=True)
code = Column(String(24), nullable=False, unique=True)
class Asset(Base):
__tablename__ = "SA_asset_t"
id = Column(Integer, primary_key=True, autoincrement=True)
projectId = Column(Integer, ForeignKey("SA_project_t.id"))
project = relation("Project")
code = Column(String(128))
element_to_asset_assoc = Table( "SA_elementToAssetAssoc_t",
Base.metadata,
Column("elementId", Integer, ForeignKey("SA_element_t.id")),
Column("assetId", Integer, ForeignKey("SA_asset_t.id")))
class Element(Base):
__tablename__ = "SA_element_t"
id = Column(Integer, primary_key=True, autoincrement=True)
projectId = Column(Integer, ForeignKey("SA_project_t.id"))
project = relation("Project")
code = Column(String(256))
assets = relation("Asset", secondary=element_to_asset_assoc, backref="elements")
Base.metadata.bind=testEngine
session = SQLAlchemySession(bind=testEngine)
Base.metadata.drop_all(checkfirst=True)
Base.metadata.create_all(testEngine, checkfirst=True)
# Create a Project, Asset and Element
project = Project()
project.code = "MyProject"
session.add(project)
asset = Asset()
asset.project = project
asset.code = "MyAsset"
session.add(asset)
element = Element()
element.project = project
element.code = "MyElement"
element.assets = [asset]
session.add(element)
session.commit()
# Now I'd like to add a new element, but first check that the
# element's code is unique within the scope of the Project
newElement = Element()
newElement.project = project
newElement.code = "MyElement"
newElement.assets = [asset]
results = session.query(Element).filter(and_( Element.project==newElement.project,
Element.code==newElement.code))
# Up until this point, newElement hasn't been inserted into the
# database, but once I query "results.count()" I find that an INSERT
# has been perfomed.
print results.count()
# p.s. I realize that results will contain both the original and
# new element, but I don't expect the new element to have been
# inserted into the database at this point.
在results 变量上调用count() 的操作是将newElement 提交给MySQL 数据库,这不是我的本意。如果删除关联表,则会得到预期的行为 - newElement 不会添加到数据库中。
从日志中我可以看出, session 在查询开始时将关联的 Assets 视为脏 Assets ,刷新它会触发 newElement 的提交。这是预期的行为吗?如果是这样,有没有办法保持多对多关系,同时在这些情况下仍然查询数据库并且不触发提交。
使用 SQLAlchemy 0.7.4
最佳答案
不需要 add()
newElement
对象,因为当您将绑定(bind)对象分配给它的关系之一时,它会自动添加到 session 中。当访问 newElement.project
属性时,它被刷新到数据库(您可以使用 autoflush=False
来禁用此行为)。 MySQL 默认使用 MyISAM 引擎,忽略事务语句。因此,所有刷新的更改都会持续存在。要启用事务支持,请将 __table_args__ = {'mysql_engine': 'InnoDB'}
添加到您的映射类。
关于mysql - 使用关联表时查询导致commit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9168466/
我正在寻找一种方法来编写 Signed-off-by:当我提交时自动标记。 我尝试通过 .git/config 文件配置它 (Reference) .我把这些代码行: [alias] comm
我使用的是 visual studio 2013,在提交 C# 代码时我面临 3 个选项。我需要解释每个选项之间关于我的本地存储库与 GitHub 存储库发生的情况的差异。 选项 1 表示提交 选项
我刚从 classes12.jar 升级到新的 jdbc 驱动程序到 ojdbc7.jar 我的应用在使用 ojdbc7.jar 运行时抛出异常: java.sql.SQLException: Cou
我问的是 Oracle SQL*PLUS ... 最佳答案 没有 :-) Oracle says The WORK keyword is supported for compliance with s
我必须在许多分支、许多存储库上恢复对文件所做的更改。我知道我可以使用 git checkout 哈希文件名,然后推送该更改。 问题是,我只知道在我想要恢复的实际提交之前有两次提交。 我怎样才能在这之前
看起来很简单,但我就是不明白。我在我的应用程序的根目录中。 这是我的工作流程。 git add . git commit -m "added a new feature some files chan
假设我有一个 git 分支,在共享它之前的最后审查中,我发现了一些小错误,例如拼写错误。我想做的是将那个补丁应用为“修复”,但它实际上会影响许多提交,因此在最终历史记录中没有错误的迹象。 也就是说,如
当我运行hg commit时,Mercurial会为我的提交消息生成一个文件,如下所示: HG: Enter commit message. Lines beginning with 'HG:' a
我已经为项目创建了一个新的存储库,并向其中添加了一些现有的代码库 (llvm)。该代码库大约有 18,000 个文件,这使得我的初始提交花费了大量时间。 (阅读5小时) 有没有办法将这个巨大的提交分成
我在 git review 上得到以下内容: git review You are about to submit multiple commits. This is expected if you
我一直在寻找一种替代解决方案来压缩分支中的一系列提交。我过去所做的是使用 git rebase -i HEAD~然后选择哪个 promise 进行压缩。通常我 pick编辑最新的提交,并压缩其间的冗余
把玩Git和GitHub,我发现有时候一个 git commit -a 需要提交修改过的文件。 (此文件已添加到项目中)。 但有时候,只是一个 git commit 会起作用。如果使用 Mercuri
我正在努力思考 Git 的复杂性。 我使用“git clone [url here]”从 GitHub 下载了一个存储库。 我做了一些更改,尝试使用“git commit”提交它们。这似乎没有将更改推
当试图恢复到之前的提交时,我尝试了: git revert --no-commit 0766c053..HEAD 然而这给出了一个错误: empty commit set passed 问题错误是什么
我的存储库的历史非常复杂。我经常发现自己想知道过去的某个提交是“在”还是“可从”某个修订版(通常是我的一个头脑)“进入”或“可访问” 我该怎么做呢? 最佳答案 您可以使用 revsets syntax
我有:http://windows.github.com/ 我当前的项目有大约 20k 个文件,大约 150MB(并且不说它有多慢而且我现在什么也做不了)它甚至不允许我提交!我收到此错误:提交失败:无
我正在运行 postgres 9.2 服务器并有一个使用 psycopg 2.5 的 python 客户端。 我进行了一些测试,因为我在日志文件中遇到了很多警告:没有正在进行的事务条目。 我有一些代码
我的主要问题是总是执行 git commit -am 而不是 git add 是否有意义。然后是 git commit -m? 我知道 -am 表示它将添加修改后的 TRACKED 文件的所有更改。所
如果我想查看 之间的差异和工作目录 (WD),我运行 % git diff 这通常会做我想做的事,但如果 WD 包含在 时被跟踪的文件,它就会这样做。已创建,但现在(或在当前分支中)未被跟踪,则
我正在阅读有关 git 对象的信息:blob、树、提交、标签。为了更好地理解 git 的工作原理,我尝试了一些低级命令,如 write-tree 和 commit-tree。 mkdir 测试; cd
我是一名优秀的程序员,十分优秀!