python - SQLAlchemy 中的物化键

标签 python sqlalchemy

通常当你有一个带有自引用的表时,比如在树中,你有一个属性作为外键,它指向表的主键。 (就像文档中的 Adjacency List Relationships 示例一样)

但是,我有一个自然键,它是这样工作的: ""为根

  • “a”、“b”、“c”等是“”的 child
  • “aa”、“ab”、“ac”等是“a”的 child
  • “ba”、“bb”、“bc”等是“b”的 child
  • “aaa”、“aab”、“aac”等是“aa”的 child

所以树中每一层都有一个字符,每个节点的子节点都是首字母相同且加了一个字符的子节点。这称为“物化 key ”

在不添加额外属性来引用父级的情况下,如何使用 SQLAlchemy 映射器执行此操作?

注意:我只对读取关系感兴趣,如果像 node.children.append(child) 这样的东西不起作用也没关系。此外,我坚持使用 0.4.8 版,但是如果这在这个版本中是不可能的,但只能在较新的版本中实现,我可能会努力更新。

编辑 我在 SA mailinglist 上得到了第一个答案.它有效,但它不像我希望的那样基于映射器(例如使用 eagerload)

最佳答案

我确实理解问题的局限性,但您为什么要避免使用额外的 key ?当然,这是冗余信息,但取决于您的数据(行数、键的平均长度),拥有额外的键实际上可能会提高您在 SELECT 上的性能,并且您可以使用 eager -以最简单的方式加载 SA 中的关系。

例如,您可以执行以下操作:

  • 添加另一个数字标识符作为 PK,并在此链接 child / parent 。
  • 添加另一个字符串标识符以指向父对象(Key:Varchar,ParentKey:Varchar)。在某些 RDBMS(如 MSSQL)中,您可以有一个 PERSISTENT COMPUTED 列,这样您的客户端甚至不必提供父键,它将使用公式从 KEY 列自动计算(剪切最后一个字符)。在这种情况下,您在此列上有一个数据库索引和非常快速的关系检索。

关于python - SQLAlchemy 中的物化键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5471687/

相关文章:

python - 使用 python 和多处理压缩输出

python - sqlalchemy在where子句中动态使用and_

python - 读取 csv 并插入数据库性能

python - 带边界的 SQLAlchemy 求和函数

pandas - Clickhouse 不返回列标题

python - 使用 sqlalchemy 语句和表达式 api 生成多个连接

python - expectedFailure 被计为错误而不是已通过

python - 如何在 Python 中使用 Selenium 在 YouTube 上搜索和播放视频?

python - 循环图度计算中的 Sage python bug?

python - Pytesseract image_to_string空输出