- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用带有 PostgreSQL 的 SQLAlchemy 使用有向图数据模型构建一个 Python Flask 应用程序。我有设置删除级联时遇到问题。虽然经过初步检查,删除似乎可行,但我不确定我是否可能会以我不理解的方式破坏事物,因为我收到以下警告:
SAWarning: DELETE statement on table 'edges' expected to delete 1 row(s); 0 were matched.
Please set confirm_deleted_rows=False within the mapper configuration to prevent this warning. (table.description, expected,rows_matched)
这是我的数据模型的核心。
class Node(db.Model):
__tablename__ = 'nodes'
__mapper_args__ = {
'polymorphic_on': type,
'polymorphic_identity': 'node'
}
id = Column(BigInteger, primary_key=True)
type = Column(String)
in_edges = relationship("Edge", cascade="save-update, merge, delete", foreign_keys="Edge.dest", back_populates='dest_node')
out_edges = relationship("Edge", cascade="save-update, merge, delete", foreign_keys="Edge.src", back_populates='src_node')
class Edge(db.Model):
__tablename__ = 'edges'
__mapper_args__ = {
'polymorphic_on': type,
'polymorphic_identity': 'edge'
}
type = Column(String, primary_key="True")
src = Column(Integer, ForeignKey('nodes.id'), primary_key=True)
dest = Column(Integer, ForeignKey('nodes.id'), primary_key=True)
src_node = relationship("Node", foreign_keys=[src], back_populates='out_edges')
dest_node = relationship("Node", foreign_keys=[dest], back_populates='in_edges')
节点由边以定向方式连接。 Edge 将 src
节点连接到 dest
节点。需要注意的一件事是Node 的主键为 id,而 Edge 的主键为 type
、src
和 dest
。自从你不能将 src 或 dest 设置为 NULL 的边,如果删除节点,则以任何方式引用它的所有边都必须也被删除。
在模型中,我在 Node 和 Edge 上创建了 SQLAlchemy relationships
,它们相互填充。在节点上端,我可以访问传入和传出 Edge,并且 Edge 可以访问它连接的节点。
我想做的是删除图表的一个子集。为此,我从一个节点开始遍历图表并遍历节点的 out_edges。我只是明确删除节点。我依靠级联删除我已经对节点的两个关系进行了配置,以负责删除边。
当如图所示配置时,我似乎总是收到警告,这似乎表明某些内容没有被删除。但是,如果我删除节点 in_edges 上的级联删除,警告就会消失。
我认为可能发生的情况是,由于 Edge 必须同时存在两个节点,因此当我删除 src 节点时,它删除传出边,然后当我删除那些边的目标节点时,它会寻找传入边, 但它已经被删除了。
所以删除级联修复了警告并在某些情况下有效,但有时我删除的节点是有一个传入边,其 src 节点不是我在步行时访问的节点。因此,确保两者都至关重要关系会导致删除级联,因此我认为以这种方式抑制警告不是正确的做法。
谁能解释一下发生了什么?忽略这个安全吗?我做错了吗?
最佳答案
我认为你的问题与https://bitbucket.org/zzzeek/sqlalchemy/issues/2403/work-around-mysql-innodb-bug-need-per有关
你可以试试这段代码。
class Edge(db.Model):
__tablename__ = 'edges'
__mapper_args__ = {
'polymorphic_on': type,
'polymorphic_identity': 'edge',
'confirm_deleted_rows': False
}
关于python - 如何修复 SQLAlchemy : SAWarning: DELETE statement on table expected to delete 1 row(s); 0 were matched,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36002638/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
我搜索了很多,但没有一个链接能帮助我解决这个问题。我得到了 ORA-21500: internal error code, arguments: [%s], [%s], [%s], [%s], [%s
我正在做 RegexOne 正则表达式教程,它有一个 question关于编写正则表达式以删除不必要的空格。 教程中提供的解决方案是 We can just skip all the starting
([\s\S]+|\s?) 中 |\s? 的目的或作用是什么?如果没有它,表达式会不会与 ([\s\S]+) 相同? 最佳答案 这不是完全相同的。 ([\s\S]+|\s?) 会匹配空字符串,而 ([
这个正则表达式有一组还是两组? 我正在尝试使用第二组访问 bookTitle 但出现错误: Pattern pattern = Pattern.compile("^\\s*(.*?)\\s+-\\s+
在 C 中给定一个字符串指针 s,下面的迭代会做什么?即它以什么方式遍历字符串? for (++s ; *s; ++s); 最佳答案 for (++s ; *s;++s) 表示 将指针 s 递增到字符
我正在用一个 node.js 应用程序解析一个大列表并有这段代码 sizeCode = dbfr.CN_DESC.split('\s+-\s*|\s*-\s+') 这似乎不起作用,因为它返回了 [ '
我正在编写一个简单的字符串连接程序。 该程序按照我发布的方式运行。但是,我首先使用以下代码编写它来查找字符串的结尾: while (*s++) ; 但是,这个方法并没有奏效。我传递给它的字符串
这个问题已经有答案了: What does (?和aramchand来自Mohandas Karamchand G 因此,在使用这些匹配来分割字符串后,您最终会得到 {"M", "K", "G"} 注
我正在尝试转换 Map到 List使用 lambda。 本质上,我想将键和值与 '=' 连接起来之间。这看起来微不足道,但我找不到如何去做。 例如 Map map = new HashMap<>();
我正在经历 K & R,并且在递增指针时遇到困难。练习 5.3(第 107 页)要求您使用指针编写一个 strcat 函数。 在伪代码中,该函数执行以下操作: 将 2 个字符串作为输入。 找到字符串
在下面的代码中,pS 和 s.pS 在最后一行是否保证相等?也就是说,在语句S s = S();中,是否可以确定不会构造一个临时的S? #include using namespace std; s
演示示例代码: public void ReverseString(char[] s) { for(int i = 0, j = s.Length-1; i < j; i++, j--){
我一直在寻找类似于 .NET examples 中的示例的 PowerShell 脚本.取一个 New-TimeSpan 并显示为 1 天 2 小时 3 分钟 4 秒。排除其零的地方,在需要的地方添加
def func(s): s = s + " is corrected" return s string_list = ["She", "He"] for s in string_li
我是 python 的新手。当我在互联网上搜索 lambda 时。我在 lambda_functions 中找到了这个声明. processFunc = collapse and (lambda s:
我最近开始学习正则表达式,并试图为上面的问题写一个正则表达式。如果限制只放在一个字母上(例如不超过 2 个“b”),这并不困难。 那么答案就是:a* c*(b|ε)a* c*(b|ε)a* c* 但是
当我运行 npm install 时出现以下错误,但我无法修复它。 我试过:npm install -g windows-build-tools 也没有修复这个错误 ERR! configure
有很多有趣的haskell网上可以找到片段。 This post可以在 this (awesome) Stack Overflow question 下找到. The author写道: discou
我知道以下三行代码旨在将字符串提取到$ value中并将其存储在$ header中。但是我不知道$value =~ s/^\s+//;和$value =~ s/\s+$//;之间有什么区别。 $val
我是一名优秀的程序员,十分优秀!