sqlalchemy使用键子字符串连接两个模型

时间:2018-10-25 07:32:14

标签: python sqlalchemy

我有两个基于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设置为外键。请建议我如何建立关系或基于域部分将两个表连接起来

1 个答案:

答案 0 :(得分:0)

可以使用SQL LIKE运算符在基于一个包含另一列的子字符串的列的两个表之间建立关系。 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)