- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个关于 SQLAlchemy 的新问题,我在试图找到一个好的解决方案时伤透了脑筋。所以我有一些表:
import sqlalchemy.orm.session
# other import statments . . .
Session = sqlalchemy.orm.session.Session
class Tempable(Base):
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=True)
temporary = Column(Boolean, nullable=False)
class Generic(Base):
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=True)
tempable_id = Column(Integer, ForeignKey(Tempable.id))
Tempable
表有一个名为 temporary
的字段。当此字段为 True 时,只有一个 Generic
可以与此 Tempable
表行关联,当相关 Generic
行被删除时,Tempable
也必须删除。否则许多 Generic
可以与 Tempable
连接并且删除其中一个不会影响 Tempable
。经过一些研究后,我发现必须使用事件才能做到这一点。代码展开如下:
class Generic(Base):
# . . .
def before_delete(self, session):
""":type session: Session"""
condition = and_(Tempable.id == self.tempable_id, Tempable.temporary == 1)
# I've tried use bulk session deletion:
# session.query(Tempable).filter(condition).delete()
# but if Tempable tables has relationships then related objects not deleted,
# I don't understand such behaviour.
# But this works fine:
for obj in session.query(Tempable).filter(condition):
session.delete(obj)
@event.listens_for(Session, 'before_flush')
def _database_flush(session, flush_context, instances):
for p_object in session.deleted:
if hasattr(p_object, "before_delete"):
p_object.before_delete(session)
for p_object in session.dirty:
if hasattr(p_object, "before_update"):
p_object.before_update(session)
for p_object in session.new:
if hasattr(p_object, "before_insert"):
p_object.before_insert(session)
但是出现了一些麻烦。当通用对象被删除时,相应的 GUI 也必须更新。为此,可以使用 Session 对象的 deleted
属性。但对我来说也有一个问题:删除的 Tempable
行没有出现在这个属性列表中。
class Database(object):
# . . .
def remove(name):
# before commit I need to obtain list of all objects that will be deleted
# that required to update GUI views
try:
this = self.__session.query(orm.Generic).filter(orm.Generic.name == name).one()
except orm.NoResultFound:
pass
else:
logging.info("Remove object: %s" % this)
self.__session.delete(this)
deleted = [obj for obj in self.__session.deleted]
# At this point, list of deleted objects of course is not contain any Tempable objects
print(deleted)
self.__session.commit()
# And here list is empty
print([obj for obj in self.__session.deleted])
return deleted
那么问题是获取已删除对象的正确方法是什么,或者整个方法可能是完全错误的?
最佳答案
批量删除系统不会处理您的关系,因为它会为所有行发出单个 DELETE 语句,而不会尝试加载和协调这些行所引用的内容。这是 the documentation for query.delete() 中列出的第一个“警告” :
The method does not offer in-Python cascading of relationships - it is assumed that ON DELETE CASCADE/SET NULL/etc. is configured for any foreign key references which require it, otherwise the database may emit an integrity violation if foreign key references are being enforced.
就“session.deleted”而言,该列表仅在刷新发生之前相关。 commit() 意味着 flush() 并且在刷新之后,所有 session.new、session.dirty、session.deleted 都被清除。您需要在将 session.deleted 清除到另一个列表之前复制它,或者可能更可靠的是在 before_flush() 中收集 session.deleted 就像您正在做的那样,并将您关心的那些对象复制到另一个列表,也许在 session.info 中;例如session.info['deleted_things'] = my_list_of_objects
。
关于python - SQLAlchemy 删除相关元素取决于标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22941595/
我有两个维度 DimFlag 和 DimPNL 以及一个事实表 FactAmount 。我正在寻找:当 pnl 是 stat(Is Stat=1) 时:sum (Actual x FlagId)对于
我试图弄清楚登录模块标志在 JAAS 中是如何工作的(使用 JBoss 5.1 EAP),我遇到了一个令人费解的情况,我希望有人能为我澄清一下。 对于背景,我的 login-config.xml 如下
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我正在通过 gradle 使用 doclet 运行 javadoc,当我运行 javadoc/doclet 任务时,我收到下一个错误: error - invalid flag: -doctitle
我尝试使用sqoop --where标志将特定的行从MySQL表导入到HDFS,但是结果不符合预期。 命令: sqoop import \ --connect "jdbc:mysql://XXXX
我有一个语言面板,其中有一个图像 (main-image),显示页面加载时的情况。我还有三个额外的图像,它们在页面加载时隐藏。 问题是当点击附加图像之一时如何切换主图像。我需要使用单击的 image
奇怪...在 StackOverflow 上有很多关于此 attr 的问题,但没有人回答我的以下问题: 我有一个span(仅作为示例),其中启用了ContentEditable。我只想保存更改的元素(
我正在使用 ChartJS 2.0 在 UI 上绘制图表。而且我能够呈现饼图。但我希望鼠标悬停时显示数据以及“%”符号。我如何追加 % 因此,如果在鼠标悬停时我得到 Rented: 93 我想看到 R
我使用的是 Servlet 3.0,我想用 HttpOnly 标志保护我的 cookie。我的 web.xml 是 true
我有一个简单的服务: public class TestService extends Service { final String LOG_TAG = "myLogs"; public void o
我正在尝试将 wget 与包含“#”符号的 url 一起使用。无论我做什么来逃避这个角色,它都不起作用。我用过\、' 和 "。但它们都不起作用。有人有什么建议吗? 谢谢! 最佳答案 如果您真的想让它有
我正在尝试创建一个数据库,但我不知道如何转义数据库名称中的 - 符号。 mysql> create database happy-face; 给我一个错误 mysql> create databa
我为我的计算机科学类(class)编写了一个程序,它读取一个文件并导入数据,然后只添加数字,但它似乎添加了一个额外的加号。 import java.io.*; //necessary for File
可能是个愚蠢的问题,但我怎样才能在与某些文本看到图像相同的行中获取图像(在本例中为标志)? 到目前为止我的 HTML 代码: FRA 最佳答案 试试这个: img { height:20px
我需要一些有关 clone() 系统调用的帮助。我试图将它与标志 CLONE_CHILD_CLEARTID 一起使用,但我看不到我指定为参数的字段值有任何变化。这是一个简单的代码: int the_c
查看 mySQL 转储时,我遇到了一些东西,想知道它们是什么。 我明白了: /*!50001 DROP TABLE IF EXISTS `xxx` */; flag 50001是什么意思,有什么意思的
是否可以传递任何 Java 编译器标志来告诉编译器不允许使用原始类型?也就是说,对于任何泛型类,让编译器强制使用参数化版本,否则抛出编译错误? 最佳答案 JDK7 (b38) 介绍 -Xlint:ra
[Flags] public enum MyEnum { None = 0, Setting1 = (1 GetAllEnums() where T : struct
我正在浏览 PackageManager API。我发现定义了以下常量: 1) GET_DISABLED_COMPONENTS 2) GET_DISABLED_UNTIL_USED_COMPONENT
我编写了一个 Go 程序来模拟按键操作。为此,我必须使用 cgo 和不同的 C 代码片段,具体取决于正在编译 Go 代码的操作系统。我编写的代码如下所示: package keyboard /* #i
我是一名优秀的程序员,十分优秀!