【问题标题】:Define relationship without foreign key定义没有外键的关系
【发布时间】:2015-08-01 12:07:44
【问题描述】:

如何在没有外键的情况下建立关系?

@declared_attr 
def custom_stuff(cls): 
    joinstr = 'foreign(Custom.name) == "{name}"'.format(name=cls.__name__)  
    return db.relationship('Custom', primaryjoin=joinstr) 

这会引发错误:
ArgumentError: Could not locate any simple equality expressions involving locally mapped foreign key columns for primary join condition

这可行,但我认为这是一个非常丑陋的 hack。

@declared_attr
def custom_stuff(cls):
    joinstr = 'or_(
                  and_(foreign(Custom.name) == MyTable.title, 
                       foreign(Custom.name) != MyTable.title), 
                  foreign(Custom.name) == "{name}")'.format(name=cls.__name__)
    return db.relationship('Custom', primaryjoin=joinstr)

有没有更好的方法来做到这一点?

编辑:额外的属性需要添加为@declared_attr,并且必须使用关系,因为我们的序列化程序是编写的,因此它可以与声明的属性一起使用。

使用@hybrid_property 或其他方法会起作用,但我们的 json 序列化程序会中断。让它发挥作用似乎比定义关系更难。

【问题讨论】:

    标签: python sqlalchemy relationship


    【解决方案1】:

    在数据库中创建表时,您不必定义关系(这几乎适用于所有 SQL)。您仍然可以连接没有预定义外键关系的表(外键的主要原因是强制数据一致性,而不是定义您可以连接的内容)。

    请参阅此内容 - http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join

    如果您仍想“显示”数据库和表结构/模型,那么最好使用一些实体关系建模器,如 ERwin(或一些图表软件)。

    【讨论】:

    • 更正,我“应该”能够在没有外键的情况下定义关系。问题是 sqlalchemy 在这种情况下会抛出一个错误,我想知道如何让它工作。
    【解决方案2】:

    也许你应该指出“关系”这个词的含义。它指出某些事物“依赖”于其他事物或两者相互依赖。 如果您尝试在 ERM(实体关系模型)上定义关系,这意味着您应该说明哪个实体“依赖”另一个实体。此外,数据库有一些技巧可以更快地处理相互关联的表,而不仅仅是以上层抽象方式关联的简单表。 你有什么理由需要这样做吗?

    【讨论】:

    • 这没有提供问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多