sqlalchemy объединяет две модели с ключевой подстрокой - PullRequest
0 голосов
/ 25 октября 2018

У меня есть две таблицы на основе оракула.Таблица 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 голосов
/ 28 октября 2018

Связь между двумя таблицами на основе одного столбца, содержащего подстроку другого столбца, может быть выполнена с помощью оператора SQL LIKE.Различные способы, которыми это может быть реализовано в чистом SQL, обсуждаются в https://stackoverflow.com/a/1386213/10548137. Следующий код реализует это в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...