【问题标题】:sqlalchemy joining two models with key substringsqlalchemy 使用键子字符串连接两个模型
【发布时间】:2019-03-29 17:44:57
【问题描述】:

我有两个基于 oracle 的表。 表 foo 有:

val1,域

x1,domain1.com

x2,domain2.com


表格栏有:

val2,主机名

A,host1.domain1.com

B,host2.domain2.com


基于这些表,我创建了一个 flask-sqlalchemy 模型

            class Foo(db.Model):
                __tablename__ = 'foo'
                val1 =  db.Column(db.String(256))
                domain  =  db.Column(db.String(256),primary_key=True)


                def __repr__(self):
                    return "<Foo(val1='%s', domain='%s')>" % (self.val1, self.domain)




            class Bar(db.Model):
                __tablename__ = 'bar'
                val2 =  db.Column(db.String(256),  primary_key=True)
                hostname =  db.Column(db.String(256),  primary_key=True)


                @hybrid_property
                def domain(self):
                    return self.hostname.split('.', 1)[1]

                def __repr__(self):
                    return "<Bar hostname='%s', domain='%s')>" % (self.hostname, self.domain)

需要根据域部分加入表 我尝试使用@hybrid_property 生成域部分 但没有设法建立基于它的关系,因为我无法将 @hybrid_property 设置为外键。请建议我如何根据域部分建立关系或加入两个表

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    可以使用 SQL LIKE 运算符执行基于一个列包含另一列的子字符串的 2 个表之间的关系。 https://stackoverflow.com/a/1386213/10548137 讨论了可以在纯 SQL 中实现的不同方法。以下代码在 Sqlalchemy 中针对您的特定用例实现了这一点。

    class Foo(db.Model):
        __tablename__ = 'foo'
        val1 =  db.Column(db.String(256))
        domain  =  db.Column(db.String(256),primary_key=True)
        bars = db.relationship("Bar", primaryjoin='db.foreign(Bar.hostname).like("%."+Foo.domain)', viewonly=True, uselist=True)
    
    
    class Bar(db.Model):
        __tablename__ = 'bar'
        val2 =  db.Column(db.String(256),  primary_key=True)
        hostname =  db.Column(db.String(256),  primary_key=True)
        foo = db.relationship("Foo", primaryjoin='Bar.hostname.like("%."+db.foreign(Foo.domain))', viewonly=True, uselist=False)
    

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 1970-01-01
      • 2013-11-14
      • 2015-08-18
      • 2022-08-24
      • 1970-01-01
      • 2013-11-05
      • 2013-01-01
      相关资源
      最近更新 更多