如何在没有外键的情况下建立关系?
@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
这有效,但我认为这是一个非常难看的黑客。
@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
,并且必须使用关系,因为我们的序列化程序已编写,因此它适用于声明的attrs。
使用@hybrid_property
或其他方法执行此操作会有效,但随后我们的json序列化程序会中断。让它发挥作用似乎比定义一种关系更难。
答案 0 :(得分:0)
在数据库中创建表时,您不必定义关系(这几乎适用于每个SQL)。您仍然可以连接没有预定义外键关系的表(外键的主要原因是强制数据一致性,而不是定义您可以加入的内容)。
请参阅此参考资料 - http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join
如果您仍然希望"显示"数据库和表结构/模型,然后更好地使用像ERwin(或一些图表软件)的实体关系建模器。
答案 1 :(得分:-2)
也许你应该指出"关系"字。它指出某些事情"取决于"在某些事情上或两者都相互依赖。 如果您尝试在ERM(实体关系模型)上定义关系,则意味着您应该说明哪个实体"取决于"在另一个。此外,数据库有一些黑客可以更快地处理彼此相关的表,而不仅仅是与上层抽象方式相关的简单表。 你有什么理由要这么做吗?